#11437 Propagate detected date format to line based parsing

Add try/catch to avoid crash
Remove flag to avoid eternal loop
This commit is contained in:
Magne Sjaastad 2024-05-28 11:22:57 +02:00
parent d1d3ee129f
commit c7fbb5374c
3 changed files with 70 additions and 70 deletions

View File

@ -60,36 +60,28 @@ void RicImportObservedDataFeature::selectObservedDataFileInDialog()
for ( const QString& fileName : fileNames ) for ( const QString& fileName : fileNames )
{ {
bool retryImport = false; QString errorText;
do if ( fileName.endsWith( ".rsm", Qt::CaseInsensitive ) )
{ {
QString errorText; observedData = observedDataCollection->createAndAddRsmObservedSummaryDataFromFile( fileName, &errorText );
}
else if ( fileName.endsWith( ".txt", Qt::CaseInsensitive ) || fileName.endsWith( ".csv", Qt::CaseInsensitive ) )
{
bool useSavedFieldValuesInDialog = false;
observedData =
observedDataCollection->createAndAddCvsObservedSummaryDataFromFile( fileName, useSavedFieldValuesInDialog, &errorText );
}
else
{
errorText = "Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format "
"or '*.txt' or '*.csv' if data is in CSV format.";
}
if ( fileName.endsWith( ".rsm", Qt::CaseInsensitive ) ) if ( !errorText.isEmpty() )
{ {
observedData = observedDataCollection->createAndAddRsmObservedSummaryDataFromFile( fileName, &errorText ); RiaLogging::errorInMessageBox( nullptr, "Errors detected during import", errorText );
retryImport = false; }
}
else if ( fileName.endsWith( ".txt", Qt::CaseInsensitive ) || fileName.endsWith( ".csv", Qt::CaseInsensitive ) )
{
bool useSavedFieldValuesInDialog = retryImport;
observedData =
observedDataCollection->createAndAddCvsObservedSummaryDataFromFile( fileName, useSavedFieldValuesInDialog, &errorText );
retryImport = !errorText.isEmpty();
}
else
{
errorText = "Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format "
"or '*.txt' or '*.csv' if data is in CSV format.";
retryImport = false;
}
if ( !errorText.isEmpty() )
{
RiaLogging::errorInMessageBox( nullptr, "Errors detected during import", errorText );
}
} while ( retryImport );
} }
RiuPlotMainWindowTools::showPlotMainWindow(); RiuPlotMainWindowTools::showPlotMainWindow();

View File

@ -88,7 +88,7 @@ bool RifCsvUserDataParser::parse( const RifAsciiDataParseOptions&
const std::map<QString, QString>& nameMapping, const std::map<QString, QString>& nameMapping,
const std::map<QString, std::pair<QString, double>>& unitMapping ) const std::map<QString, std::pair<QString, double>>& unitMapping )
{ {
if ( determineCsvLayout() == LineBased ) return parseLineBasedData(); if ( determineCsvLayout() == LineBased ) return parseLineBasedData( parseOptions );
return parseColumnBasedData( parseOptions, nameMapping, unitMapping ); return parseColumnBasedData( parseOptions, nameMapping, unitMapping );
} }
@ -617,7 +617,7 @@ bool RifCsvUserDataParser::parseColumnBasedData( const RifAsciiDataParseOptions&
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RifCsvUserDataParser::parseLineBasedData() bool RifCsvUserDataParser::parseLineBasedData( const RifAsciiDataParseOptions& parseOptions )
{ {
QTextStream* dataStream = openDataStream(); QTextStream* dataStream = openDataStream();
if ( !dataStream ) if ( !dataStream )
@ -682,54 +682,62 @@ bool RifCsvUserDataParser::parseLineBasedData()
} }
} }
// DATE try
QDateTime dateTime;
{ {
auto dateText = dataItems[colIndexes[(size_t)CsvLineBasedColumnType::DATE]].toStdString(); // DATE
QDateTime dateTime;
dateTime = tryParseDateTime( dateText, ISO_DATE_FORMAT );
if ( !dateTime.isValid() )
{ {
// Try to match date and time auto dateText = dataItems[colIndexes[(size_t)CsvLineBasedColumnType::DATE]].toStdString();
dateTime = tryParseDateTime( dateText, QString( ISO_DATE_FORMAT ) + " " + TIME_FORMAT );
const auto formats = { parseOptions.dateFormat, QString( ISO_DATE_FORMAT ), QString( ISO_DATE_FORMAT ) + " " + TIME_FORMAT };
for ( const auto& format : formats )
{
dateTime = tryParseDateTime( dateText, format );
if ( dateTime.isValid() ) break;
}
if ( !dateTime.isValid() )
{
if ( m_errorText )
m_errorText->append(
QString( "CSV import: Failed to parse date time value in line %1" ).arg( QString::number( lineCount ) ) );
throw 0;
}
} }
if ( !dateTime.isValid() ) // VALUE
{ {
if ( m_errorText ) bool parseOk = true;
m_errorText->append( double value = QLocale::c().toDouble( dataItems[colIndexes[(size_t)CsvLineBasedColumnType::VALUE]], &parseOk );
QString( "CSV import: Failed to parse date time value in line %1" ).arg( QString::number( lineCount ) ) );
throw 0; if ( !parseOk )
{
if ( m_errorText )
m_errorText->append(
QString( "CSV import: Failed to parse numeric value in line %1\n" ).arg( QString::number( lineCount ) ) );
throw 0;
}
auto& samples = addressesAndData[addr];
samples.push_back( std::make_pair( dateTime.toSecsSinceEpoch(), value ) );
}
// ERROR VALUE
if ( expectErrorValue )
{
bool parseOk = true;
double value = QLocale::c().toDouble( dataItems[colIndexes[(size_t)CsvLineBasedColumnType::ERROR_VALUE]], &parseOk );
if ( !parseOk ) value = DOUBLE_INF;
auto& samples = addressesAndData[errAddr];
samples.push_back( std::make_pair( dateTime.toSecsSinceEpoch(), value ) );
} }
} }
catch ( ... )
// VALUE
{ {
bool parseOk = true; closeDataStream();
double value = QLocale::c().toDouble( dataItems[colIndexes[(size_t)CsvLineBasedColumnType::VALUE]], &parseOk ); return false;
if ( !parseOk )
{
if ( m_errorText )
m_errorText->append(
QString( "CSV import: Failed to parse numeric value in line %1\n" ).arg( QString::number( lineCount ) ) );
throw 0;
}
auto& samples = addressesAndData[addr];
samples.push_back( std::make_pair( dateTime.toSecsSinceEpoch(), value ) );
}
// ERROR VALUE
if ( expectErrorValue )
{
bool parseOk = true;
double value = QLocale::c().toDouble( dataItems[colIndexes[(size_t)CsvLineBasedColumnType::ERROR_VALUE]], &parseOk );
if ( !parseOk ) value = DOUBLE_INF;
auto& samples = addressesAndData[errAddr];
samples.push_back( std::make_pair( dateTime.toSecsSinceEpoch(), value ) );
} }
} }
} }

View File

@ -83,7 +83,7 @@ private:
bool parseColumnBasedData( const RifAsciiDataParseOptions& parseOptions, bool parseColumnBasedData( const RifAsciiDataParseOptions& parseOptions,
const std::map<QString, QString>& nameMapping = {}, const std::map<QString, QString>& nameMapping = {},
const std::map<QString, std::pair<QString, double>>& unitMapping = {} ); const std::map<QString, std::pair<QString, double>>& unitMapping = {} );
bool parseLineBasedData(); bool parseLineBasedData( const RifAsciiDataParseOptions& parseOptions );
static QDateTime tryParseDateTime( const std::string& colData, const QString& format ); static QDateTime tryParseDateTime( const std::string& colData, const QString& format );
private: private: