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++

#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();
}
}