#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 "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<QString, QString, QString> 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 )
{

View File

@ -27,13 +27,14 @@
///
//==================================================================================================
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& 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<RifElasticPr
///
//--------------------------------------------------------------------------------------------------
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& 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<RifElasticPr
QString line = in.readLine();
if ( !isEmptyLine( line ) && !isCommentLine( line ) )
{
RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath );
RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath, separator );
elasticProperties.push_back( faciesProp );
}
@ -74,10 +76,12 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifElasticProperties
RifElasticPropertiesReader::parseElasticProperties( const QString& line, int lineNumber, const QString& filePath )
RifElasticProperties RifElasticPropertiesReader::parseElasticProperties( const QString& line,
int lineNumber,
const QString& filePath,
const QString& separator )
{
QStringList tokens = tokenize( line, "," );
QStringList tokens = tokenize( line, separator );
// Plus one to allow trailing separator
const int expectedTokens = 13;

View File

@ -45,16 +45,21 @@ struct RifElasticProperties
class RifElasticPropertiesReader
{
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:
static void readElasticProperties( std::vector<RifElasticProperties>& 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<RifElasticProperties>& 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 );

View File

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