///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017- Statoil ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RifColumnBasedUserDataParser.h" #include "RifEclipseUserDataKeywordTools.h" #include "RifEclipseUserDataParserTools.h" #include "RiaDateStringParser.h" #include "RiaLogging.h" #include "RiaTextStringTools.h" #include "cvfAssert.h" #include #include #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifColumnBasedUserDataParser::RifColumnBasedUserDataParser( const QString& data, QString* errorText ) : m_errorText( errorText ) { parseTableData( data ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- const std::vector& RifColumnBasedUserDataParser::tableData() const { return m_tableDatas; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- const Column* RifColumnBasedUserDataParser::columnInfo( size_t tableIndex, size_t columnIndex ) const { if ( tableIndex >= m_tableDatas.size() ) return nullptr; if ( columnIndex >= m_tableDatas[tableIndex].columnInfos().size() ) return nullptr; return &( m_tableDatas[tableIndex].columnInfos()[columnIndex] ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifColumnBasedUserDataParser::parseTableData( const QString& data ) { std::string stdData = data.toStdString(); bool isFixedWidth = RifEclipseUserDataParserTools::isFixedWidthHeader( stdData ); std::stringstream streamData; streamData.str( stdData ); std::vector rawTables; do { std::vector errorStrings; TableData table; if ( isFixedWidth ) { auto columnInfos = RifEclipseUserDataParserTools::columnInfoForFixedColumnWidth( streamData ); table = TableData( "", "", columnInfos ); } else { table = RifEclipseUserDataParserTools::tableDataFromText( streamData, &errorStrings ); } if ( m_errorText ) { for ( auto s : errorStrings ) { QString errorText = QString( "\n%1" ).arg( QString::fromStdString( s ) ); m_errorText->append( errorText ); } } std::vector& columnInfos = table.columnInfos(); int columnCount = static_cast( columnInfos.size() ); if ( columnCount == 0 ) break; int stepTypeIndex = -1; for ( size_t i = 0; i < columnInfos.size(); i++ ) { if ( RifEclipseUserDataKeywordTools::isStepType( columnInfos[i].summaryAddress.vectorName() ) ) { stepTypeIndex = static_cast( i ); } } std::string line; std::getline( streamData, line ); do { QString qLine = QString::fromStdString( line ); QStringList entries = RiaTextStringTools::splitSkipEmptyParts( qLine ); if ( stepTypeIndex > -1 && (unsigned int)entries.size() < columnInfos.size() ) { entries.insert( stepTypeIndex, " " ); } if ( entries.size() < columnCount ) break; for ( int i = 0; i < columnCount; i++ ) { if ( columnInfos[i].dataType == Column::TEXT ) { columnInfos[i].textValues.push_back( entries[i].toStdString() ); } else { double entry = entries[i].toDouble(); columnInfos[i].values.push_back( entry ); } } } while ( std::getline( streamData, line ) ); rawTables.push_back( table ); } while ( streamData.good() ); m_tableDatas = RifEclipseUserDataParserTools::mergeEqualTimeSteps( rawTables ); }