#1816 Observed data: Add ascii parser

This commit is contained in:
Rebecca Cox 2017-09-20 15:23:45 +02:00
parent d5bd78392f
commit bea3bd12b8
5 changed files with 257 additions and 9 deletions

View File

@ -16,6 +16,7 @@ ${CEE_CURRENT_LIST_DIR}RifPerforationIntervalReader.h
${CEE_CURRENT_LIST_DIR}RifReaderEclipseInput.h
${CEE_CURRENT_LIST_DIR}RifReaderEclipseOutput.h
${CEE_CURRENT_LIST_DIR}RifSummaryReaderInterface.h
${CEE_CURRENT_LIST_DIR}RifColumnBasedAsciiParser.h
${CEE_CURRENT_LIST_DIR}RifReaderObservedData.h
${CEE_CURRENT_LIST_DIR}RifReaderEclipseSummary.h
${CEE_CURRENT_LIST_DIR}RifJsonEncodeDecode.h
@ -48,6 +49,7 @@ ${CEE_CURRENT_LIST_DIR}RifPerforationIntervalReader.cpp
${CEE_CURRENT_LIST_DIR}RifReaderEclipseInput.cpp
${CEE_CURRENT_LIST_DIR}RifReaderEclipseOutput.cpp
${CEE_CURRENT_LIST_DIR}RifSummaryReaderInterface.cpp
${CEE_CURRENT_LIST_DIR}RifColumnBasedAsciiParser.cpp
${CEE_CURRENT_LIST_DIR}RifReaderObservedData.cpp
${CEE_CURRENT_LIST_DIR}RifReaderEclipseSummary.cpp
${CEE_CURRENT_LIST_DIR}RifJsonEncodeDecode.cpp

View File

@ -0,0 +1,126 @@
/////////////////////////////////////////////////////////////////////////////////
//
// 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RifColumnBasedAsciiParser.h"
#include "RiaLogging.h"
#include <QString>
#include <QStringList>
#include <QTextStream>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifColumnBasedAsciiParser::RifColumnBasedAsciiParser(QString& data, const QString dateFormat, QLocale decimalLocale, QString cellSeparator)
{
parseData(data, dateFormat, decimalLocale, cellSeparator);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<QString>& RifColumnBasedAsciiParser::headers() const
{
return m_data.m_headers;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<QDateTime>& RifColumnBasedAsciiParser::timeSteps() const
{
return m_data.m_timeSteps;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<double>& RifColumnBasedAsciiParser::columnValues(size_t columnIndex) const
{
return m_data.m_values[columnIndex];
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RifColumnBasedAsciiParser::parseData(QString& data, QString dateFormat, QLocale decimalLocale, QString cellSeparator)
{
QTextStream tableData(&data);
{
QString header;
do {
header = tableData.readLine();
} while (header.isEmpty() && !tableData.atEnd());
// No header row found
if (header.isEmpty()) return;
QStringList columnHeaders = header.split('\t');
for (int i = 1; i < columnHeaders.size(); ++i)
{
m_data.m_headers.push_back(columnHeaders[i]);
}
// No columns found
if (m_data.m_headers.empty()) return;
}
int numColumns = static_cast<int>(m_data.m_headers.size());
m_data.m_values.resize(numColumns);
size_t row = 0;
while (!tableData.atEnd())
{
++row;
QString line = tableData.readLine();
// Skip empty lines
if (line.isEmpty()) continue;
QStringList columns = line.split(cellSeparator);
if (columns.size() != numColumns + 1)
{
RiaLogging::warning(QString("Invalid number of columns in row %1").arg(row));
continue;
}
QDateTime date = QDateTime::fromString(columns[0], dateFormat);
if (!date.isValid())
{
RiaLogging::warning(QString("First column of row %1 could not be parsed as a date: %2").arg(row).arg(columns[0]));
continue;
}
m_data.m_timeSteps.push_back(date);
for (int col = 1; col < columns.size(); ++col)
{
bool ok;
m_data.m_values[col - 1].push_back(decimalLocale.toDouble(columns[col], &ok));
if (!ok)
{
RiaLogging::warning(QString("Could not parse value at row %1 column %2 as double: %3. Defaulting to 0.0").arg(row).arg(col).arg(columns[col]));
}
}
}
}

View File

@ -0,0 +1,51 @@
/////////////////////////////////////////////////////////////////////////////////
//
// 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include <QDateTime>
#include <QLocale>
#include <QString>
#include <vector>
struct AsciiData
{
std::vector<QString> m_headers;
std::vector<QDateTime> m_timeSteps;
std::vector< std::vector<double> > m_values;
};
//==================================================================================================
///
//==================================================================================================
class RifColumnBasedAsciiParser
{
public:
RifColumnBasedAsciiParser(QString& data, const QString dateFormat, QLocale decimalLocale, QString cellSeparator);
const std::vector<QString>& headers() const;
const std::vector<QDateTime>& timeSteps() const;
const std::vector<double>& columnValues(size_t columnIndex) const;
private:
void parseData(QString& data, QString dateFormat, QLocale decimalLocale, QString cellSeparator);
private:
AsciiData m_data;
};

View File

@ -18,20 +18,22 @@
#include "RifReaderObservedData.h"
#include "RifColumnBasedAsciiParser.h"
#include "RifEclipseSummaryAddress.h"
#include "ert/ecl/ecl_sum.h"
#include <string>
#include <assert.h>
#include <QDateTime>
#include "ert/ecl/smspec_node.h"
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifReaderObservedData::RifReaderObservedData()
{
}
//--------------------------------------------------------------------------------------------------
@ -47,7 +49,13 @@ RifReaderObservedData::~RifReaderObservedData()
//--------------------------------------------------------------------------------------------------
bool RifReaderObservedData::open(const std::string& headerFileName, const std::vector<std::string>& dataFileNames)
{
if (headerFileName.empty()) return false;
QString data = headerFileName.data();
return false;
//RiaParseAsciiData::parseData(data, settings);
//m_asciiParser = RifColumnBasedAsciiParser(data)
}
//--------------------------------------------------------------------------------------------------
@ -63,6 +71,11 @@ bool RifReaderObservedData::values(const RifEclipseSummaryAddress& resultAddress
//--------------------------------------------------------------------------------------------------
int RifReaderObservedData::timeStepCount() const
{
if (m_asciiParser)
{
return static_cast<int>(m_asciiParser->timeSteps().size());
}
return 0;
}
@ -71,8 +84,18 @@ int RifReaderObservedData::timeStepCount() const
//--------------------------------------------------------------------------------------------------
const std::vector<time_t>& RifReaderObservedData::timeSteps() const
{
std::vector<time_t> steps;
return steps;
std::vector<time_t> timeStepsTime_t;
if (m_asciiParser)
{
for (QDateTime timeStep : m_asciiParser->timeSteps())
{
time_t t = timeStep.toTime_t();
timeStepsTime_t.push_back(t);
}
}
return timeStepsTime_t;
}
//--------------------------------------------------------------------------------------------------
@ -80,10 +103,55 @@ const std::vector<time_t>& RifReaderObservedData::timeSteps() const
//--------------------------------------------------------------------------------------------------
void RifReaderObservedData::buildMetaData()
{
if (m_allResultAddresses.size() == 0)
{
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddress RifReaderObservedData::address(const AsciiData& asciiData, std::string identifierName, RifEclipseSummaryAddress::SummaryVarCategory summaryCategory)
{
std::string quantityName;
int regionNumber(-1);
int regionNumber2(-1);
std::string wellGroupName;
std::string wellName;
int wellSegmentNumber(-1);
std::string lgrName;
int cellI(-1);
int cellJ(-1);
int cellK(-1);
switch (summaryCategory)
{
case RifEclipseSummaryAddress::SUMMARY_WELL_GROUP:
wellGroupName = identifierName;
break;
case RifEclipseSummaryAddress::SUMMARY_WELL:
wellName = identifierName;
break;
case RifEclipseSummaryAddress::SUMMARY_WELL_LGR:
lgrName = identifierName;
break;
default:
break;
}
return RifEclipseSummaryAddress(summaryCategory,
quantityName,
regionNumber,
regionNumber2,
wellGroupName,
wellName,
wellSegmentNumber,
lgrName,
cellI, cellJ, cellK);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -19,7 +19,6 @@
#pragma once
#include "RifEclipseSummaryAddress.h"
#include "RifSummaryReaderInterface.h"
#include <string>
@ -28,9 +27,10 @@
#include "cvfObject.h"
struct AsciiData;
class QDateTime;
class RifColumnBasedAsciiParser;
class RifEclipseSummaryAddress;
//==================================================================================================
//
@ -51,9 +51,10 @@ public:
private:
virtual int timeStepCount() const override;
virtual void buildMetaData() override;
private:
RifEclipseSummaryAddress address(const AsciiData& asciiData, std::string identifierName, RifEclipseSummaryAddress::SummaryVarCategory summaryCategor);
private:
RifColumnBasedAsciiParser* m_asciiParser;
};