#include #include #include #include #include #include #include "MainDialog.h" #include "ui_MainDialog.h" const QString& MainDialog::DEFAULT_REGEX = QStringLiteral( // language=Regexp "\\*\\*\\* Etablissement (?[0-9][AB0-9][0-9]{7}) \\*\\*\\*[\\s\\S]*?(?:(?: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(); } }