From eaea8b613455671d9bb38e5536a7edf6abb11658 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Thu, 3 Sep 2020 10:27:05 +0200 Subject: [PATCH 1/2] #6203 Fracture Model: Allow trailing seperator in import of elastic table csv. --- .../RifElasticPropertiesReader.cpp | 4 +++- .../RifElasticPropertiesReader-Test.cpp | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp b/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp index 91191f12b7..31e7d0ff7b 100644 --- a/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp +++ b/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp @@ -79,7 +79,9 @@ RifElasticProperties { QStringList tokens = tokenize( line, "," ); - if ( tokens.size() != 13 ) + // Plus one to allow trailing separator + const int expectedTokens = 13; + if ( !( tokens.size() == expectedTokens || tokens.size() == expectedTokens + 1 ) ) { throw FileParseException( QString( "Incomplete data on line %1: %2" ).arg( lineNumber ).arg( filePath ) ); } diff --git a/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp b/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp index 9a022b509a..dcd2920d59 100644 --- a/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp +++ b/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp @@ -77,6 +77,29 @@ TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFile ) ASSERT_DOUBLE_EQ( 0.55, elasticProperties[1].immobileFluidSaturation ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithTrailingSeparator ) +{ + QTemporaryFile file; + EXPECT_TRUE( file.open() ); + + { + QTextStream out( &file ); + out << "Norne,Not,Sand,0.00,25,0.25,2000,0.2,0.3,0.4,0.5,0.6,0.4,\n" + << "Norne,Not,Sand,0.10,19,0.27,2099,0.3,0.4,0.5,0.2,0.5,0.55,\n"; + } + + QStringList filePaths; + filePaths.append( file.fileName() ); + + std::vector elasticProperties; + RifElasticPropertiesReader::readElasticProperties( elasticProperties, filePaths ); + + ASSERT_EQ( 2u, elasticProperties.size() ); +} + //-------------------------------------------------------------------------------------------------- /// Helper to check exception messages when reading invalid files //-------------------------------------------------------------------------------------------------- From 4f5bf4f606f25d17f4d04bfee9a0d0420d7c3b2c Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Thu, 3 Sep 2020 13:29:36 +0200 Subject: [PATCH 2/2] #6043 Elastic Properties Reader: auto-detect csv cell separator. --- .../RicElasticPropertiesImportTools.cpp | 6 ++++- .../RifElasticPropertiesReader.cpp | 18 +++++++++------ .../RifElasticPropertiesReader.h | 21 ++++++++++------- .../RifElasticPropertiesReader-Test.cpp | 23 +++++++++++++++++++ 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp b/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp index 5ae2fc98e6..7c112aff97 100644 --- a/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp +++ b/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp @@ -23,6 +23,7 @@ #include "RimElasticProperties.h" #include "RimFractureModel.h" +#include "RifCsvUserDataParser.h" #include "RifElasticPropertiesReader.h" #include "RifFileParseTools.h" @@ -37,6 +38,9 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QString& filePath, RimFractureModel* fractureModel ) { + RifCsvUserDataFileParser csvParser( filePath ); + QString separator = csvParser.tryDetermineCellSeparator(); + typedef std::tuple FaciesKey; // Read the facies properties from file @@ -45,7 +49,7 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt { QStringList filePaths; filePaths << filePath; - RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths ); + RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths, separator ); } catch ( FileParseException& exception ) { diff --git a/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp b/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp index 31e7d0ff7b..a4d371a19c 100644 --- a/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp +++ b/ApplicationCode/FileInterface/RifElasticPropertiesReader.cpp @@ -27,13 +27,14 @@ /// //================================================================================================== void RifElasticPropertiesReader::readElasticProperties( std::vector& elasticProperties, - const QStringList& filePaths ) + const QStringList& filePaths, + const QString& separator ) { for ( const QString& filePath : filePaths ) { try { - readElasticProperties( elasticProperties, filePath ); + readElasticProperties( elasticProperties, filePath, separator ); } catch ( FileParseException& ) { @@ -48,7 +49,8 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector& elasticProperties, - const QString& filePath ) + const QString& filePath, + const QString& separator ) { QFile file( filePath ); if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) @@ -63,7 +65,7 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector& elasticProperties, const QStringList& filePaths ); + static void readElasticProperties( std::vector& elasticProperties, + const QStringList& filePaths, + const QString& separator = "," ); private: - static void readElasticProperties( std::vector& elasticProperties, const QString& filePath ); - static RifElasticProperties parseElasticProperties( const QString& line, int lineNumber, const QString& filePath ); - static QStringList tokenize( const QString& line, const QString& separator ); - static void verifyNonEmptyTokens( const QStringList& tokens, - const QStringList& nameOfNonEmptyTokens, - int lineNumber, - const QString& filePath ); + static void readElasticProperties( std::vector& elasticProperties, + const QString& filePath, + const QString& separator ); + static RifElasticProperties + parseElasticProperties( const QString& line, int lineNumber, const QString& filePath, const QString& separator ); + static QStringList tokenize( const QString& line, const QString& separator ); + static void verifyNonEmptyTokens( const QStringList& tokens, + const QStringList& nameOfNonEmptyTokens, + int lineNumber, + const QString& filePath ); static double parseDouble( const QString& token, const QString& propertyName, int lineNumber, const QString& filePath ); diff --git a/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp b/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp index dcd2920d59..af4d4fb976 100644 --- a/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp +++ b/ApplicationCode/UnitTests/RifElasticPropertiesReader-Test.cpp @@ -100,6 +100,29 @@ TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithTrailingSeparator ASSERT_EQ( 2u, elasticProperties.size() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithCustomSeparator ) +{ + QTemporaryFile file; + EXPECT_TRUE( file.open() ); + + { + QTextStream out( &file ); + out << "Norne;Not;Sand;0.00;25;0.25;2000;0.2;0.3;0.4;0.5;0.6;0.4;\n" + << "Norne;Not;Sand;0.10;19;0.27;2099;0.3;0.4;0.5;0.2;0.5;0.55;\n"; + } + + QStringList filePaths; + filePaths.append( file.fileName() ); + + std::vector elasticProperties; + RifElasticPropertiesReader::readElasticProperties( elasticProperties, filePaths, ";" ); + + ASSERT_EQ( 2u, elasticProperties.size() ); +} + //-------------------------------------------------------------------------------------------------- /// Helper to check exception messages when reading invalid files //--------------------------------------------------------------------------------------------------