You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.7 KiB
C++
114 lines
3.7 KiB
C++
#include <QtCore/QRegularExpression>
|
|
#include <QtCore/QString>
|
|
#include <QtCore/QTextStream>
|
|
|
|
#include <QtWidgets/QFileDialog>
|
|
#include <QtWidgets/QMessageBox>
|
|
#include <QtWidgets/QPushButton>
|
|
|
|
#include "MainDialog.h"
|
|
#include "ui_MainDialog.h"
|
|
|
|
const QString& MainDialog::DEFAULT_REGEX = QStringLiteral(
|
|
// language=Regexp
|
|
"\\*\\*\\* Etablissement (?<etablissement>[0-9][AB0-9][0-9]{7}) \\*\\*\\*[\\s\\S]*?(?:(?:Champs a fiabiliser : (?<champs_a_fiabiliser>[^\\s]+))|(?=\\*\\*\\* Etablissement )|$)"
|
|
);
|
|
|
|
MainDialog::MainDialog (QWidget* parent) :
|
|
QDialog(parent),
|
|
m_ui(new Ui::MainDialog) {
|
|
m_ui->setupUi(this);
|
|
defaultRegex();
|
|
|
|
connect(m_ui->input_button, &QPushButton::clicked, this, &MainDialog::onInputButtonClick);
|
|
connect(m_ui->csv_button, &QPushButton::clicked, this, &MainDialog::onCsvButtonClick);
|
|
|
|
connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &MainDialog::onAccepted);
|
|
}
|
|
|
|
MainDialog::~MainDialog () {
|
|
delete m_ui;
|
|
}
|
|
|
|
void MainDialog::defaultRegex () {
|
|
if (m_ui->regex_input->toPlainText().isEmpty()) {
|
|
m_ui->regex_input->setPlainText(MainDialog::DEFAULT_REGEX);
|
|
}
|
|
}
|
|
|
|
void MainDialog::onInputButtonClick () {
|
|
m_ui->input_input
|
|
->setText(QFileDialog::getOpenFileName(this, "Fichier à traiter", QString()));
|
|
}
|
|
|
|
void MainDialog::onCsvButtonClick () {
|
|
m_ui->csv_input
|
|
->setText(QFileDialog::getSaveFileName(this, "CSV de sortie", QString(), "Fichier CSV (*.csv)"));
|
|
}
|
|
|
|
void MainDialog::onAccepted () {
|
|
defaultRegex();
|
|
const QRegularExpression regex(m_ui->regex_input->toPlainText());
|
|
if (!regex.isValid()) {
|
|
QMessageBox::critical(this, "Erreur", "L'expression régulière n'est pas valide");
|
|
return;
|
|
}
|
|
|
|
if (m_ui->input_input->text().isEmpty()) {
|
|
QMessageBox::critical(this, "Erreur", "Vous devez sélectionner un fichier à traiter");
|
|
return;
|
|
}
|
|
if (m_ui->csv_input->text().isEmpty()) {
|
|
QMessageBox::critical(this, "Erreur", "Vous devez indiquer le fichier CSV de sortie");
|
|
return;
|
|
}
|
|
|
|
QFile input(m_ui->input_input->text());
|
|
if (!input.exists()) {
|
|
QMessageBox::critical(this, "Erreur", "Le fichier à traiter n'existe pas !");
|
|
return;
|
|
}
|
|
if (!input.open(QIODevice::Text | QIODevice::ReadOnly)) {
|
|
QMessageBox::critical(this, "Erreur", "Impossible de lire le fichier à traiter");
|
|
return;
|
|
}
|
|
const QString data = input.readAll();
|
|
input.close();
|
|
|
|
QFile outputFile(m_ui->csv_input->text());
|
|
if (!outputFile.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Truncate)) {
|
|
QMessageBox::critical(this, "Erreur", "Impossible d'écrire dans le fichier CSV");
|
|
return;
|
|
}
|
|
QTextStream output(&outputFile);
|
|
|
|
QStringList groups_name = regex.namedCaptureGroups();
|
|
for (int pos = 1; pos < groups_name.size(); pos++) {
|
|
groups_name[pos] = "\"" + (groups_name[pos].isEmpty() ? "Champ n°" + QString::number(pos) : groups_name[pos].replace("\"", "\\\"")) + "\"";
|
|
}
|
|
groups_name.pop_front();
|
|
output << groups_name.join(";") + "\n";
|
|
|
|
QRegularExpressionMatchIterator it_regex = regex.globalMatch(data);
|
|
|
|
int nbMatch = 0;
|
|
while (it_regex.hasNext()) {
|
|
nbMatch++;
|
|
|
|
QStringList groups = it_regex.next().capturedTexts();
|
|
groups.pop_front();
|
|
for (QStringList::iterator it_group = groups.begin(); it_group != groups.end(); ++it_group) {
|
|
(*it_group) = "\"" + (*it_group).replace("\"", "\\\"") + "\"";
|
|
}
|
|
|
|
output << groups.join(";") + "\n";
|
|
}
|
|
|
|
outputFile.close();
|
|
|
|
QMessageBox::information(this, "Fin", QString::number(nbMatch) + " lignes trouvées");
|
|
if (nbMatch > 0) {
|
|
this->accept();
|
|
}
|
|
}
|