#2003 Observed Data : Handle STEPTYPE with potentially missing text for first row

This commit is contained in:
Magne Sjaastad 2017-11-06 10:53:46 +01:00
parent 296bacf7f6
commit f53acbdce2
5 changed files with 123 additions and 6 deletions

View File

@ -18,6 +18,7 @@
#include "RifColumnBasedUserDataParser.h"
#include "RifEclipseUserDataKeywordTools.h"
#include "RifEclipseUserDataParserTools.h"
#include "RiaDateStringParser.h"
@ -103,6 +104,15 @@ void RifColumnBasedUserDataParser::parseTableData(const QString& data)
int columnCount = static_cast<int>(columnInfos.size());
if (columnCount == 0) break;
int stepTypeIndex = -1;
for (size_t i = 0; i < columnInfos.size(); i++)
{
if (RifEclipseUserDataKeywordTools::isStepType(columnInfos[i].summaryAddress.quantityName()))
{
stepTypeIndex = static_cast<int>(i);
}
}
std::string line;
std::getline(streamData, line);
@ -111,6 +121,12 @@ void RifColumnBasedUserDataParser::parseTableData(const QString& data)
QString qLine = QString::fromStdString(line);
QStringList entries = qLine.split(" ", QString::SkipEmptyParts);
if (stepTypeIndex > -1 &&
entries.size() < columnInfos.size())
{
entries.insert(stepTypeIndex, " ");
}
if (entries.size() < columnCount) break;
for (int i = 0; i < columnCount; i++)

View File

@ -247,3 +247,11 @@ RifEclipseSummaryAddress RifEclipseUserDataKeywordTools::makeAndFillAddress(cons
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifEclipseUserDataKeywordTools::isStepType(const std::string& identifier)
{
return (identifier.find("STEPTYPE") != std::string::npos);
}

View File

@ -38,5 +38,7 @@ public:
static bool isDate(const std::string& identifier);
static RifEclipseSummaryAddress makeAndFillAddress(const std::string quantityName, const std::vector<std::string>& columnHeaderText);
static bool isStepType(const std::string& identifier);
};

View File

@ -593,6 +593,7 @@ std::vector<std::string> RifEclipseUserDataParserTools::findValidHeaderLines(std
size_t columnCount = 0;
std::string line;
bool continueParsing = true;
bool hasStepType = false;
while (continueParsing)
{
posAtTableDataStart = streamData.tellg();
@ -605,25 +606,42 @@ std::vector<std::string> RifEclipseUserDataParserTools::findValidHeaderLines(std
{
if (!RifEclipseUserDataParserTools::isLineSkippable(line))
{
auto words = RifEclipseUserDataParserTools::splitLineAndRemoveComments(line);
if (!hasStepType)
{
for (size_t i = 0; i < words.size(); i++)
{
if (RifEclipseUserDataKeywordTools::isStepType(words[i]))
{
hasStepType = true;
}
}
}
if (columnCount == 0)
{
// Fist line with valid header data defines the number of columns
auto words = RifEclipseUserDataParserTools::splitLineAndRemoveComments(line);
columnCount = words.size();
headerLines.push_back(line);
}
else
{
auto words = RifEclipseUserDataParserTools::splitLineAndRemoveComments(line);
std::vector<double> doubleValues = RifEclipseUserDataParserTools::splitLineToDoubles(line);
if (doubleValues.size() < columnCount &&
words.size() < columnCount)
if (doubleValues.size() < columnCount && words.size() < columnCount)
{
// Consider a line with double values less than column count as a table header
headerLines.push_back(line);
if (hasStepType && (words.size() + 1 == columnCount))
{
continueParsing = false;
}
else
{
// Consider a line with double values less than column count as a table header
headerLines.push_back(line);
}
}
else
{
@ -725,6 +743,10 @@ std::vector<ColumnInfo> RifEclipseUserDataParserTools::columnInfoFromColumnHeade
RifEclipseSummaryAddress adr = RifEclipseUserDataKeywordTools::makeAndFillAddress(quantity, restOfHeader);
ColumnInfo ci = ColumnInfo::createColumnInfo(quantity, unit, adr);
if (RifEclipseUserDataKeywordTools::isStepType(quantity))
{
ci.isStringData = true;
}
table.push_back(ci);
}

View File

@ -212,3 +212,72 @@ TEST(FixedWidthDataParser, VaryingTimeStepCount)
EXPECT_EQ(size_t(2), tables.size());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(FixedWidthDataParser, HandlingOfStepType)
{
QString data = R"(
1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN NORNE_ATW2013_RFTPLT_V3 ECLIPSE 2016.2 DATESTAMP 13-DEC-2016 USER dtb MACHINE stj-lcb01-01-03
-------------------------------------------------------------------------------------------------------------------------------
DATE YEARS NEWTON MLINEARS DAY MONTH YEAR NEWTON TCPU ELAPSED
YEARS SECONDS SECONDS
-------------------------------------------------------------------------------------------------------------------------------
6-NOV-1997 0 0 0 6 11 1997 0 4.880000 9.720000
7-NOV-1997 0.002738 3 28 7 11 1997 3 5.240000 10.11000
8-NOV-1997 0.006556 4 42 8 11 1997 4 5.730000 10.60000
9-NOV-1997 0.009231 3 28 9 11 1997 3 6.080000 10.95000
10-NOV-1997 0.011462 4 32 10 11 1997 4 6.500000 11.37000
11-NOV-1997 0.013710 4 35 11 11 1997 4 6.940001 11.81000
11-NOV-1997 0.015950 3 25 11 11 1997 3 7.270000 12.14000
12-NOV-1997 0.018477 4 35 12 11 1997 4 7.710001 12.58000
13-NOV-1997 0.020190 3 24 13 11 1997 3 8.040000 12.91000
14-NOV-1997 0.021903 3 27 14 11 1997 3 8.380000 13.25000
14-NOV-1997 0.024232 2 17 14 11 1997 2 8.640000 13.57000
17-NOV-1997 0.030838 3 26 17 11 1997 3 8.980000 13.91000
19-NOV-1997 0.037060 3 30 19 11 1997 3 9.350000 14.28000
21-NOV-1997 0.042841 4 35 21 11 1997 4 9.790001 14.71000
23-NOV-1997 0.049239 5 45 23 11 1997 5 10.33000 15.26000
25-NOV-1997 0.054613 3 25 25 11 1997 3 10.67000 15.60000
28-NOV-1997 0.061135 3 27 28 11 1997 3 11.01000 15.94000
29-NOV-1997 0.064791 3 23 29 11 1997 3 11.33000 16.26000
1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN NORNE_ATW2013_RFTPLT_V3 ECLIPSE 2016.2 DATESTAMP 13-DEC-2016 USER dtb MACHINE stj-lcb01-01-03
-------------------------------------------------------------------------------------------------------------------------------
DATE TIMESTEP TCPUTS TCPUDAY MLINEARS MSUMLINS NLINEARS STEPTYPE TELAPLIN MSUMNEWT
DAYS SECONDS SEC/D SECONDS
-------------------------------------------------------------------------------------------------------------------------------
6-NOV-1997 0 4.880000 0 0 0 0 0 0
7-NOV-1997 1.000000 5.240000 5.240000 28 28 9.333333 INIT 0.361071 3
8-NOV-1997 1.394612 0.490000 0.351352 42 70 10.50000 TRNC 0.151429 7
9-NOV-1997 0.977053 0.350000 0.358220 28 98 9.333333 TRNC 0.111735 10
10-NOV-1997 0.814727 0.420000 0.515510 32 130 8.000000 TRNC 0.087462 14
11-NOV-1997 0.821321 0.430000 0.523547 35 165 8.750000 TRNC 0.071576 18
11-NOV-1997 0.817933 0.320000 0.391230 25 190 8.333333 TRNC 0.063895 21
12-NOV-1997 0.923225 0.430000 0.465759 35 225 8.750000 TRNC 0.055911 25
13-NOV-1997 0.625564 0.320000 0.511538 24 249 8.000000 HALF 0.051847 28
14-NOV-1997 0.625564 0.340000 0.543509 27 276 9.000000 REPT 0.048007 31
14-NOV-1997 0.850771 0.240000 0.282097 17 293 8.500000 TRNC 0.046314 33
17-NOV-1997 2.412731 0.340000 0.140919 26 319 8.666667 TRNC 0.043605 36
19-NOV-1997 2.272543 0.360000 0.158413 30 349 10.00000 TRNC 0.040917 39
21-NOV-1997 2.111558 0.440000 0.208377 35 384 8.750000 TRNC 0.038307 43
23-NOV-1997 2.336865 0.540000 0.231079 45 429 9.000000 TRNC 0.035571 48
25-NOV-1997 1.962967 0.330000 0.168113 25 454 8.333333 EFF+ 0.034361 51
28-NOV-1997 2.382306 0.340000 0.142719 27 481 9.000000 TRNC 0.033139 54
29-NOV-1997 1.335130 0.310000 0.232187 23 504 7.666667 HALF 0.032262 57
)";
RifColumnBasedUserDataParser parser(data);
auto tables = parser.tableData();
EXPECT_EQ(size_t(1), tables.size());
EXPECT_EQ(size_t(19), tables[0].columnInfos().size());
}