From c6da9ad8a8c409e9f2ec6aa04d2ad83988882001 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Wed, 15 Oct 2025 13:47:19 +0200 Subject: [PATCH] Refactor CSV parser: Extract method for parsing date time. --- .../FileInterface/RifCsvUserDataParser.cpp | 52 +++++++++++-------- .../FileInterface/RifCsvUserDataParser.h | 3 +- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp index f9d2fbbae2..dfd23237f2 100644 --- a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp +++ b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp @@ -560,24 +560,7 @@ std::expected RifCsvUserDataParser::parseColumnBasedData( const R } else if ( col.dataType == Column::DATETIME ) { - QDateTime dt = tryParseDateTime( colData.toStdString(), parseOptions.dateTimeFormat ); - - // Try to match date format only - if ( !dt.isValid() && parseOptions.dateFormat != parseOptions.dateTimeFormat ) - { - dt = tryParseDateTime( colData.toStdString(), parseOptions.dateFormat ); - } - if ( !dt.isValid() && !parseOptions.fallbackDateTimeFormat.isEmpty() ) - { - dt = tryParseDateTime( colData.toStdString(), parseOptions.fallbackDateTimeFormat ); - } - - if ( !dt.isValid() && parseOptions.startDateTime.isValid() ) - { - double minutes = colData.toDouble(); - dt = parseOptions.startDateTime.addSecs( minutes * 60 ); - } - + QDateTime dt = parseDateTime( colData, parseOptions ); if ( !dt.isValid() ) { QString errorMsg = "CSV import: Failed to parse date time value"; @@ -665,7 +648,7 @@ std::expected RifCsvUserDataParser::parseLineBasedData( const Rif // DATE QDateTime dateTime; { - auto dateText = dataItems[colIndexes[(size_t)CsvLineBasedColumnType::DATE]].toStdString(); + auto dateText = dataItems[colIndexes[(size_t)CsvLineBasedColumnType::DATE]]; const auto formats = { parseOptions.dateFormat, QString( ISO_DATE_FORMAT ), QString( ISO_DATE_FORMAT ) + " " + TIME_FORMAT }; for ( const auto& format : formats ) @@ -741,9 +724,36 @@ std::expected RifCsvUserDataParser::parseLineBasedData( const Rif //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QDateTime RifCsvUserDataParser::tryParseDateTime( const std::string& colData, const QString& format ) +QDateTime RifCsvUserDataParser::tryParseDateTime( const QString& colData, const QString& format ) { - return RiaQDateTimeTools::fromString( QString::fromStdString( colData ), format ); + return RiaQDateTimeTools::fromString( colData, format ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDateTime RifCsvUserDataParser::parseDateTime( const QString& colData, const RifAsciiDataParseOptions& parseOptions ) +{ + QDateTime dt = tryParseDateTime( colData, parseOptions.dateTimeFormat ); + + // Try to match date format only + if ( !dt.isValid() && parseOptions.dateFormat != parseOptions.dateTimeFormat ) + { + dt = tryParseDateTime( colData, parseOptions.dateFormat ); + } + + if ( !dt.isValid() && !parseOptions.fallbackDateTimeFormat.isEmpty() ) + { + dt = tryParseDateTime( colData, parseOptions.fallbackDateTimeFormat ); + } + + if ( !dt.isValid() && parseOptions.startDateTime.isValid() ) + { + double minutes = colData.toDouble(); + dt = parseOptions.startDateTime.addSecs( minutes * 60 ); + } + + return dt; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.h b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.h index 52229d4ffe..34b6e2d7b0 100644 --- a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.h +++ b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.h @@ -85,7 +85,8 @@ private: const std::map& nameMapping = {}, const std::map>& unitMapping = {} ); std::expected parseLineBasedData( const RifAsciiDataParseOptions& parseOptions ); - static QDateTime tryParseDateTime( const std::string& colData, const QString& format ); + static QDateTime tryParseDateTime( const QString& colData, const QString& format ); + static QDateTime parseDateTime( const QString& colData, const RifAsciiDataParseOptions& parseOptions ); private: TableData m_tableData;