From 5b62f9461b52d9b159bc0b8af4bca1d2bdb3e509 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Thu, 12 Mar 2026 10:37:12 +0100 Subject: [PATCH] CSV import has now support for optional columns. --- data/filehandler.cpp | 1 + formats/csvparser.cpp | 21 ++++++++++++--------- genericcore.cpp | 5 ++++- model/metadata.h | 2 ++ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/data/filehandler.cpp b/data/filehandler.cpp index c405e55..ba9a851 100644 --- a/data/filehandler.cpp +++ b/data/filehandler.cpp @@ -45,6 +45,7 @@ QList FileHandler::getItemValuesFromCSVFile(const QString& file QFile file; file.setFileName(filePath); if (file.exists()) { + // TODO inform UI on CSV import errors result = CsvParser::getItemsFromCSVFile(filePath); } return result; diff --git a/formats/csvparser.cpp b/formats/csvparser.cpp index cf2715a..76beb5e 100644 --- a/formats/csvparser.cpp +++ b/formats/csvparser.cpp @@ -52,7 +52,11 @@ bool CsvParser::isCsvCompatible(const rapidcsv::Document& doc) { qInfo() << "Checking CSV document for compatiblity..."; const std::vector columnNames = doc.GetColumnNames(); for (const QString& headerName : GET_HEADER_NAMES()) { - bool isHeaderNameFound = false; + if (OPTIONAL_CSV_HEADERS.contains(headerName)) { + /// no need to have a column for the optional values + continue; + } + /// these column must be found in CSV document if (std::find(columnNames.begin(), columnNames.end(), headerName) != columnNames.end()) { qDebug() << QString("Header found in column names: %1").arg(headerName); } else { @@ -86,14 +90,13 @@ QHash> CsvParser::extractColumnValues( const rapidcsv::Document& doc) { QHash> columnValueMap; for (const QString& columnName : headerNames) { - // TODO add support for optional columns - // if (optionalCsvHeaderNames.contains(columnName)) { - // const std::vector columnNames = doc.GetColumnNames(); - // int columnIdx = doc.GetColumnIdx(columnName.toStdString()); - // if (columnIdx == -1) { - // continue; - // } - // } + if (OPTIONAL_CSV_HEADERS.contains(columnName)) { + const std::vector columnNames = doc.GetColumnNames(); + int columnIdx = doc.GetColumnIdx(columnName.toStdString()); + if (columnIdx == -1) { + continue; + } + } const std::vector columnValues = doc.GetColumn(columnName.toStdString()); columnValueMap.insert(columnName, columnValues); diff --git a/genericcore.cpp b/genericcore.cpp index 6403ea5..ea95018 100644 --- a/genericcore.cpp +++ b/genericcore.cpp @@ -119,13 +119,16 @@ void GenericCore::importCSVFile(const QString& filePath) { qInfo() << "importing items from CSV..."; qDebug() << "filePath:" << filePath; const QList itemValuesList = FileHandler::getItemValuesFromCSVFile(filePath); - // TODO inform UI on errors if (itemValuesList.isEmpty()) { qDebug() << "No items found. Doing nothing..."; + displayStatusMessage("No items found in CSV file. Either empty or not compatible."); return; } // qDebug() << "CSV file content:" << itemValuesList; m_mainModel->insertItems(m_mainModel->rowCount(), itemValuesList); + const QString messageString = + QString(tr("Imported %1 item(s) from CSV file.")).arg(itemValuesList.size()); + displayStatusMessage(messageString); } bool GenericCore::exportCSVFile(const QString& filePath) { diff --git a/model/metadata.h b/model/metadata.h index 8acc286..8684e94 100644 --- a/model/metadata.h +++ b/model/metadata.h @@ -41,6 +41,8 @@ static QList DOUBLE_ROLES = {FactorRole}; static const QList TYPE_ROLES = {TypeRole}; static const QList TYPES = {"A", "B", "C", ""}; +static const QStringList OPTIONAL_CSV_HEADERS = {"description", "info"}; + /// JSON keys static const QString ITEMS_KEY_STRING = "items"; static const QString ITEM_KEY_STRING = "item";