#1776 CVS data parser. Made parsing more generic. Handle error result columns

This commit is contained in:
Bjørn Erik Jensen 2018-05-23 12:26:37 +02:00
parent 8f5c3436ce
commit 22c71b60dd
16 changed files with 78 additions and 13 deletions

View File

@ -84,6 +84,14 @@ bool RiaStdStringTools::containsAlphabetic(const std::string& s)
return std::find_if(s.begin(), s.end(), [](char c) { return isalpha(c); }) != s.end();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaStdStringTools::containsOnlyLettersAndDigits(const std::string& s)
{
return std::find_if(s.begin(), s.end(), [](char c) { return !isalpha(c) && !isdigit(c); }) == s.end();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -36,6 +36,7 @@ public:
static int toInt(const std::string& s);
static double toDouble(const std::string& s);
static bool containsAlphabetic(const std::string& s);
static bool containsOnlyLettersAndDigits(const std::string& s);
static bool startsWithAlphabetic(const std::string& s);
static std::vector<std::string> splitStringBySpace(const std::string& s);

View File

@ -280,7 +280,8 @@ RimSummaryCurve* RicPlotProductionRateFeature::addSummaryCurve( RimSummaryPlot*
-1,
-1,
-1,
-1);
-1,
false);
if (!gridSummaryCase->summaryReader()->hasAddress(addr))
{

View File

@ -196,7 +196,7 @@ bool RifCsvUserDataParser::parseColumnInfo(QTextStream* dataStream, const AsciiD
for (int iCol = 0; iCol < colCount; iCol++)
{
QString colName = RiaTextStringTools::trimAndRemoveDoubleSpaces(lineColumns[iCol]);
RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::importedAddress(colName.toStdString());
RifEclipseSummaryAddress addr = RifEclipseUserDataKeywordTools::makeAndFillAddressFromObservedData(colName.toStdString());
Column col = Column::createColumnInfoFromCsvData(addr, "");
columnInfoList->push_back(col);

View File

@ -35,7 +35,9 @@ RifEclipseSummaryAddress::RifEclipseSummaryAddress(SummaryVarCategory category,
m_wellSegmentNumber(-1),
m_cellI(-1),
m_cellJ(-1),
m_cellK(-1)
m_cellK(-1),
m_aquiferNumber(-1),
m_isErrorResult(false)
{
std::tuple<int, int, int> ijkTuple;
std::pair<int, int> reg2regPair;
@ -225,7 +227,7 @@ std::string RifEclipseSummaryAddress::uiText(RifEclipseSummaryAddress::SummaryId
case RifEclipseSummaryAddress::INPUT_LGR_NAME: return lgrName();
case RifEclipseSummaryAddress::INPUT_SEGMENT_NUMBER: return std::to_string(wellSegmentNumber());
case RifEclipseSummaryAddress::INPUT_AQUIFER_NUMBER: return std::to_string(aquiferNumber());
case RifEclipseSummaryAddress::INPUT_VECTOR_NAME: return quantityName();
case RifEclipseSummaryAddress::INPUT_VECTOR_NAME: return quantityName() + (m_isErrorResult ? " (err)" : "");
}
return "";
}
@ -430,6 +432,7 @@ bool operator==(const RifEclipseSummaryAddress& first, const RifEclipseSummaryAd
}
break;
}
if (first.isErrorResult() != second.isErrorResult()) return false;
return true;
}
@ -515,6 +518,7 @@ bool operator<(const RifEclipseSummaryAddress& first, const RifEclipseSummaryAdd
break;
}
if (first.isErrorResult() != second.isErrorResult()) return first.isErrorResult() < second.isErrorResult();
return false;
}

View File

@ -75,7 +75,8 @@ public:
m_cellI(-1),
m_cellJ(-1),
m_cellK(-1),
m_aquiferNumber(-1)
m_aquiferNumber(-1),
m_isErrorResult(false)
{
}
@ -90,7 +91,8 @@ public:
int cellI,
int cellJ,
int cellK,
int aquiferNumber):
int aquiferNumber,
bool isErrorResult):
m_variableCategory(category),
m_quantityName(quantityName),
m_regionNumber(regionNumber),
@ -102,7 +104,8 @@ public:
m_cellI(cellI),
m_cellJ(cellJ),
m_cellK(cellK),
m_aquiferNumber(aquiferNumber)
m_aquiferNumber(aquiferNumber),
m_isErrorResult(isErrorResult)
{
}
@ -144,6 +147,9 @@ public:
void setRegion(int region) { m_regionNumber = region; }
void setAquiferNumber(int aquiferNumber) { m_aquiferNumber = aquiferNumber; }
void setAsErrorResult() { m_isErrorResult = true; }
bool isErrorResult() const { return m_isErrorResult; }
private:
std::string formatUiTextIJK() const;
@ -163,6 +169,8 @@ private:
int m_cellJ;
int m_cellK;
int m_aquiferNumber;
bool m_isErrorResult;
};
bool operator==(const RifEclipseSummaryAddress& first, const RifEclipseSummaryAddress& second);

View File

@ -23,6 +23,8 @@
#include "RifEclipseUserDataParserTools.h"
#include <QStringList>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -168,6 +170,7 @@ RifEclipseSummaryAddress RifEclipseUserDataKeywordTools::makeAndFillAddress(cons
int cellJ = -1;
int cellK = -1;
int aquiferNumber = -1;
bool isErrorResult = false;
switch (category)
{
@ -276,10 +279,35 @@ RifEclipseSummaryAddress RifEclipseUserDataKeywordTools::makeAndFillAddress(cons
cellI,
cellJ,
cellK,
aquiferNumber);
aquiferNumber,
isErrorResult);
}
//--------------------------------------------------------------------------------------------------
/// Column header text format: [<ER|ERR|ERROR>:]<VECTOR>:<CATEGORY_VALUE_NAME1>[:<CATEGORY_VALUE_NAME2>][....]
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddress RifEclipseUserDataKeywordTools::makeAndFillAddressFromObservedData(const std::string& columnHeaderText)
{
QStringList names = QString().fromStdString(columnHeaderText).split(":");
int vectorNameIndex = 0;
bool isErrorResult = false;
if (names.size() > 1 && names[0].trimmed().startsWith("ER", Qt::CaseInsensitive))
{
vectorNameIndex = 1;
isErrorResult = true;
}
std::vector<std::string> columnHeaderTexts;
for (int i = vectorNameIndex + 1; i < names.size(); i++) columnHeaderTexts.push_back(names[i].trimmed().toStdString());
RifEclipseSummaryAddress address = makeAndFillAddress(names[vectorNameIndex].trimmed().toStdString(), columnHeaderTexts);
if (isErrorResult) address.setAsErrorResult();
return address;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -42,6 +42,7 @@ public:
static bool isYearX(const std::string& identifier);
static RifEclipseSummaryAddress makeAndFillAddress(const std::string quantityName, const std::vector<std::string>& columnHeaderText);
static RifEclipseSummaryAddress makeAndFillAddressFromObservedData(const std::string& columnHeaderText);
static bool isStepType(const std::string& identifier);
static size_t computeRequiredHeaderLineCount(const std::vector<std::string>& words);

View File

@ -123,6 +123,8 @@ RifEclipseSummaryAddress::SummaryVarCategory RifEclipseUserDataParserTools::iden
{
if (word.size() == 0) return RifEclipseSummaryAddress::SUMMARY_INVALID;
if (!RiaStdStringTools::containsOnlyLettersAndDigits(word)) return RifEclipseSummaryAddress::SUMMARY_INVALID;
if (word.size() > 2 && word[0] == 'R' && word[2] == 'F')
{
return RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION;

View File

@ -176,7 +176,8 @@ bool RifKeywordVectorUserData::parse(const QString& data, const QString& customW
-1,
-1,
-1,
-1);
-1,
false);
m_allResultAddresses.push_back(addr);

View File

@ -235,6 +235,7 @@ RifEclipseSummaryAddress addressFromErtSmSpecNode(const smspec_node_type * ertSu
int cellJ(-1);
int cellK(-1);
int aquiferNumber(-1);
bool isErrorResult(false);
quantityName = smspec_node_get_keyword(ertSumVarNode);
@ -355,7 +356,8 @@ RifEclipseSummaryAddress addressFromErtSmSpecNode(const smspec_node_type * ertSu
wellSegmentNumber,
lgrName,
cellI, cellJ, cellK,
aquiferNumber);
aquiferNumber,
isErrorResult);
}
//--------------------------------------------------------------------------------------------------

View File

@ -144,6 +144,7 @@ RifEclipseSummaryAddress RifReaderObservedData::address(const QString& quantity,
int cellJ(-1);
int cellK(-1);
int aquiferNumber(-1);
bool isErrorResult(false);
switch (summaryCategory)
{
@ -169,7 +170,8 @@ RifEclipseSummaryAddress RifReaderObservedData::address(const QString& quantity,
wellSegmentNumber,
lgrName,
cellI, cellJ, cellK,
aquiferNumber);
aquiferNumber,
isErrorResult);
}
//--------------------------------------------------------------------------------------------------

View File

@ -67,6 +67,7 @@ RimSummaryAddress::RimSummaryAddress()
CAF_PDM_InitFieldNoDefault(&m_cellJ, "SummaryCellJ", "J", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_cellK, "SummaryCellK", "K", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_aquiferNumber, "SummaryAquifer", "Aquifer", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_isErrorResult, "IsErrorResult", "Is Error Result", "", "", "");
m_category = RifEclipseSummaryAddress::SUMMARY_INVALID;
m_regionNumber = -1;
@ -76,6 +77,7 @@ RimSummaryAddress::RimSummaryAddress()
m_cellJ = -1;
m_cellK = -1;
m_aquiferNumber = -1;
m_isErrorResult = false;
}
//--------------------------------------------------------------------------------------------------
@ -100,6 +102,7 @@ void RimSummaryAddress::setAddress(const RifEclipseSummaryAddress& addr)
m_wellSegmentNumber = addr.wellSegmentNumber();
m_lgrName = addr.lgrName().c_str();
m_aquiferNumber = addr.aquiferNumber();
m_isErrorResult = addr.isErrorResult();
m_cellI = addr.cellI(); m_cellJ = addr.cellJ(); m_cellK = addr.cellK();
}
@ -118,6 +121,7 @@ RifEclipseSummaryAddress RimSummaryAddress::address()
m_wellSegmentNumber(),
m_lgrName().toStdString(),
m_cellI(), m_cellJ(), m_cellK(),
m_aquiferNumber);
m_aquiferNumber,
m_isErrorResult);
}

View File

@ -63,5 +63,6 @@ private:
caf::PdmField<int> m_cellJ;
caf::PdmField<int> m_cellK;
caf::PdmField<int> m_aquiferNumber;
caf::PdmField<bool> m_isErrorResult;
};

View File

@ -412,7 +412,7 @@ TEST(RifColumnBasedRsmspecParserTest, TestTableValues)
RifColumnBasedUserData userData;
userData.parse(data);
RifEclipseSummaryAddress adr(RifEclipseSummaryAddress::SUMMARY_WELL, "WLVP", -1, -1, "", "P-15P", -1, "", -1, -1, -1, -1);
RifEclipseSummaryAddress adr(RifEclipseSummaryAddress::SUMMARY_WELL, "WLVP", -1, -1, "", "P-15P", -1, "", -1, -1, -1, -1, false);
QDateTime firstTimeStep = RiaQDateTimeTools::addDays(RiaQDateTimeTools::epoch(), 1.0);
auto timeSteps = userData.timeSteps(adr);

View File

@ -607,6 +607,8 @@ QList<caf::PdmOptionItemInfo> RiuSummaryCurveDefSelection::calculateValueOptions
{
for (const auto& address : addrUnion[i])
{
if (address.isErrorResult()) continue;
auto name = address.uiText(identifierAndField->summaryIdentifier());
if (name.size() > 0)
{