mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#1776 CVS data parser. Made parsing more generic. Handle error result columns
This commit is contained in:
parent
8f5c3436ce
commit
22c71b60dd
@ -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();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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);
|
||||
|
@ -280,7 +280,8 @@ RimSummaryCurve* RicPlotProductionRateFeature::addSummaryCurve( RimSummaryPlot*
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1);
|
||||
-1,
|
||||
false);
|
||||
|
||||
if (!gridSummaryCase->summaryReader()->hasAddress(addr))
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -176,7 +176,8 @@ bool RifKeywordVectorUserData::parse(const QString& data, const QString& customW
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
-1);
|
||||
-1,
|
||||
false);
|
||||
|
||||
m_allResultAddresses.push_back(addr);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user