#6043 Elastic Properties Reader: auto-detect csv cell separator.

This commit is contained in:
Kristian Bendiksen 2020-09-03 13:29:36 +02:00
parent eaea8b6134
commit 4f5bf4f606
4 changed files with 52 additions and 16 deletions

View File

@ -23,6 +23,7 @@
#include "RimElasticProperties.h" #include "RimElasticProperties.h"
#include "RimFractureModel.h" #include "RimFractureModel.h"
#include "RifCsvUserDataParser.h"
#include "RifElasticPropertiesReader.h" #include "RifElasticPropertiesReader.h"
#include "RifFileParseTools.h" #include "RifFileParseTools.h"
@ -37,6 +38,9 @@
void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QString& filePath, void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QString& filePath,
RimFractureModel* fractureModel ) RimFractureModel* fractureModel )
{ {
RifCsvUserDataFileParser csvParser( filePath );
QString separator = csvParser.tryDetermineCellSeparator();
typedef std::tuple<QString, QString, QString> FaciesKey; typedef std::tuple<QString, QString, QString> FaciesKey;
// Read the facies properties from file // Read the facies properties from file
@ -45,7 +49,7 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt
{ {
QStringList filePaths; QStringList filePaths;
filePaths << filePath; filePaths << filePath;
RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths ); RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths, separator );
} }
catch ( FileParseException& exception ) catch ( FileParseException& exception )
{ {

View File

@ -27,13 +27,14 @@
/// ///
//================================================================================================== //==================================================================================================
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QStringList& filePaths ) const QStringList& filePaths,
const QString& separator )
{ {
for ( const QString& filePath : filePaths ) for ( const QString& filePath : filePaths )
{ {
try try
{ {
readElasticProperties( elasticProperties, filePath ); readElasticProperties( elasticProperties, filePath, separator );
} }
catch ( FileParseException& ) catch ( FileParseException& )
{ {
@ -48,7 +49,8 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QString& filePath ) const QString& filePath,
const QString& separator )
{ {
QFile file( filePath ); QFile file( filePath );
if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
@ -63,7 +65,7 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
QString line = in.readLine(); QString line = in.readLine();
if ( !isEmptyLine( line ) && !isCommentLine( line ) ) if ( !isEmptyLine( line ) && !isCommentLine( line ) )
{ {
RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath ); RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath, separator );
elasticProperties.push_back( faciesProp ); elasticProperties.push_back( faciesProp );
} }
@ -74,10 +76,12 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RifElasticProperties RifElasticProperties RifElasticPropertiesReader::parseElasticProperties( const QString& line,
RifElasticPropertiesReader::parseElasticProperties( const QString& line, int lineNumber, const QString& filePath ) int lineNumber,
const QString& filePath,
const QString& separator )
{ {
QStringList tokens = tokenize( line, "," ); QStringList tokens = tokenize( line, separator );
// Plus one to allow trailing separator // Plus one to allow trailing separator
const int expectedTokens = 13; const int expectedTokens = 13;

View File

@ -45,16 +45,21 @@ struct RifElasticProperties
class RifElasticPropertiesReader class RifElasticPropertiesReader
{ {
public: public:
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, const QStringList& filePaths ); static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QStringList& filePaths,
const QString& separator = "," );
private: private:
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, const QString& filePath ); static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
static RifElasticProperties parseElasticProperties( const QString& line, int lineNumber, const QString& filePath ); const QString& filePath,
static QStringList tokenize( const QString& line, const QString& separator ); const QString& separator );
static void verifyNonEmptyTokens( const QStringList& tokens, static RifElasticProperties
const QStringList& nameOfNonEmptyTokens, parseElasticProperties( const QString& line, int lineNumber, const QString& filePath, const QString& separator );
int lineNumber, static QStringList tokenize( const QString& line, const QString& separator );
const QString& filePath ); 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 ); static double parseDouble( const QString& token, const QString& propertyName, int lineNumber, const QString& filePath );

View File

@ -100,6 +100,29 @@ TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithTrailingSeparator
ASSERT_EQ( 2u, elasticProperties.size() ); 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<RifElasticProperties> elasticProperties;
RifElasticPropertiesReader::readElasticProperties( elasticProperties, filePaths, ";" );
ASSERT_EQ( 2u, elasticProperties.size() );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// Helper to check exception messages when reading invalid files /// Helper to check exception messages when reading invalid files
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------