mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
CSV import. Read file refactoring
This commit is contained in:
@@ -51,7 +51,7 @@ RifCsvUserData::~RifCsvUserData()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RifCsvUserData::parse(const QString& data, const AsciiDataParseOptions& parseOptions, QString* errorText)
|
bool RifCsvUserData::parse(const QString& fileName, const AsciiDataParseOptions& parseOptions, QString* errorText)
|
||||||
{
|
{
|
||||||
m_allResultAddresses.clear();
|
m_allResultAddresses.clear();
|
||||||
m_timeSteps.clear();
|
m_timeSteps.clear();
|
||||||
@@ -59,11 +59,10 @@ bool RifCsvUserData::parse(const QString& data, const AsciiDataParseOptions& par
|
|||||||
m_mapFromAddressToResultIndex.clear();
|
m_mapFromAddressToResultIndex.clear();
|
||||||
|
|
||||||
m_parser = std::unique_ptr<RifCsvUserDataParser>(new RifCsvUserDataParser(errorText));
|
m_parser = std::unique_ptr<RifCsvUserDataParser>(new RifCsvUserDataParser(errorText));
|
||||||
m_parser->parse(data, parseOptions);
|
m_parser->parse(fileName, parseOptions);
|
||||||
if (!m_parser)
|
if (!m_parser)
|
||||||
{
|
{
|
||||||
RiaLogging::error(QString("Failed to parse file"));
|
RiaLogging::error(QString("Failed to parse file"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
RifCsvUserData();
|
RifCsvUserData();
|
||||||
~RifCsvUserData();
|
~RifCsvUserData();
|
||||||
|
|
||||||
bool parse(const QString& data, const AsciiDataParseOptions& parseOptions, QString* errorText = nullptr);
|
bool parse(const QString& fileName, const AsciiDataParseOptions& parseOptions, QString* errorText = nullptr);
|
||||||
|
|
||||||
virtual const std::vector<time_t>& timeSteps(const RifEclipseSummaryAddress& resultAddress) const override;
|
virtual const std::vector<time_t>& timeSteps(const RifEclipseSummaryAddress& resultAddress) const override;
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
@@ -44,9 +44,9 @@ RifCsvUserDataParser::RifCsvUserDataParser(QString* errorText)
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RifCsvUserDataParser::parse(const QString& data, const AsciiDataParseOptions& parseOptions)
|
bool RifCsvUserDataParser::parse(const QString& fileName, const AsciiDataParseOptions& parseOptions)
|
||||||
{
|
{
|
||||||
return parseData(data, parseOptions);
|
return parseData(fileName, parseOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -71,13 +71,21 @@ const ColumnInfo* RifCsvUserDataParser::columnInfo(size_t columnIndex) const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RifCsvUserDataParser::parseData(const QString& data, const AsciiDataParseOptions& parseOptions)
|
bool RifCsvUserDataParser::parseData(const QString& fileName, const AsciiDataParseOptions& parseOptions)
|
||||||
{
|
{
|
||||||
|
bool errors = false;
|
||||||
enum { HEADER_ROW, FIRST_DATA_ROW, DATA_ROW } parseState = HEADER_ROW;
|
enum { HEADER_ROW, FIRST_DATA_ROW, DATA_ROW } parseState = HEADER_ROW;
|
||||||
int colCount = -1;
|
int colCount = -1;
|
||||||
std::vector<ColumnInfo> cols;
|
std::vector<ColumnInfo> cols;
|
||||||
|
|
||||||
QTextStream dataStream(const_cast<QString*>(&data));
|
QFile file(fileName);
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
{
|
||||||
|
RiaLogging::error(QString("Failed to open %1").arg(fileName));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream dataStream(&file);
|
||||||
while (!dataStream.atEnd())
|
while (!dataStream.atEnd())
|
||||||
{
|
{
|
||||||
QString line = dataStream.readLine();
|
QString line = dataStream.readLine();
|
||||||
@@ -102,7 +110,8 @@ bool RifCsvUserDataParser::parseData(const QString& data, const AsciiDataParseOp
|
|||||||
else if(lineColumns.size() != colCount)
|
else if(lineColumns.size() != colCount)
|
||||||
{
|
{
|
||||||
m_errorText->append("CSV file has invalid content (Column count mismatch)");
|
m_errorText->append("CSV file has invalid content (Column count mismatch)");
|
||||||
return false;
|
errors = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(parseState == FIRST_DATA_ROW)
|
else if(parseState == FIRST_DATA_ROW)
|
||||||
{
|
{
|
||||||
@@ -161,15 +170,21 @@ bool RifCsvUserDataParser::parseData(const QString& data, const AsciiDataParseOp
|
|||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
m_errorText->append("CSV file has invalid content (Column type mismatch)");
|
m_errorText->append("CSV file has invalid content (Column type mismatch)");
|
||||||
return false;
|
errors = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TableData td("", "", cols);
|
file.close();
|
||||||
m_tableData = td;
|
|
||||||
return true;
|
if (!errors)
|
||||||
|
{
|
||||||
|
TableData td("", "", cols);
|
||||||
|
m_tableData = td;
|
||||||
|
}
|
||||||
|
return !errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -41,13 +41,13 @@ public:
|
|||||||
RifCsvUserDataParser(QString* errorText = nullptr);
|
RifCsvUserDataParser(QString* errorText = nullptr);
|
||||||
|
|
||||||
|
|
||||||
bool parse(const QString& data, const AsciiDataParseOptions& parseOptions);
|
bool parse(const QString& fileName, const AsciiDataParseOptions& parseOptions);
|
||||||
const TableData& tableData() const;
|
const TableData& tableData() const;
|
||||||
|
|
||||||
const ColumnInfo* columnInfo(size_t columnIndex) const;
|
const ColumnInfo* columnInfo(size_t columnIndex) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool parseData(const QString& data, const AsciiDataParseOptions& parseOptions);
|
bool parseData(const QString& fileName, const AsciiDataParseOptions& parseOptions);
|
||||||
QStringList splitLineAndTrim(const QString& list, const QString& separator);
|
QStringList splitLineAndTrim(const QString& list, const QString& separator);
|
||||||
QDateTime tryParseDateTime(const std::string& colData, const QString& format);
|
QDateTime tryParseDateTime(const std::string& colData, const QString& format);
|
||||||
|
|
||||||
|
|||||||
@@ -57,19 +57,8 @@ void RimCsvUserData::createSummaryReaderInterface()
|
|||||||
|
|
||||||
if (caf::Utils::fileExists(this->summaryHeaderFilename()))
|
if (caf::Utils::fileExists(this->summaryHeaderFilename()))
|
||||||
{
|
{
|
||||||
QFile file(this->summaryHeaderFilename());
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
||||||
{
|
|
||||||
RiaLogging::error(QString("Failed to open %1").arg(this->summaryHeaderFilename()));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream in(&file);
|
|
||||||
QString fileContents = in.readAll();
|
|
||||||
|
|
||||||
RifCsvUserData* csvUserData = new RifCsvUserData();
|
RifCsvUserData* csvUserData = new RifCsvUserData();
|
||||||
if (csvUserData->parse(fileContents, m_parseOptions, &m_errorText))
|
if (csvUserData->parse(this->summaryHeaderFilename(), m_parseOptions, &m_errorText))
|
||||||
{
|
{
|
||||||
m_summaryReader = csvUserData;
|
m_summaryReader = csvUserData;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,33 +84,31 @@ RimObservedData* RimObservedDataCollection::createAndAddObservedDataFromFileName
|
|||||||
{
|
{
|
||||||
RimObservedData* observedData = nullptr;
|
RimObservedData* observedData = nullptr;
|
||||||
|
|
||||||
if (caf::Utils::fileExists(fileName))
|
|
||||||
{
|
{
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!file.exists())
|
||||||
{
|
{
|
||||||
QString s = QString("Failed to open %1").arg(fileName);
|
QString s = QString("File does not exist, %1").arg(fileName);
|
||||||
RiaLogging::error(s);
|
RiaLogging::error(s);
|
||||||
|
|
||||||
if (errorText) errorText->append(s);
|
if (errorText) errorText->append(s);
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fileName.endsWith(".rsm", Qt::CaseInsensitive))
|
if (fileName.endsWith(".rsm", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
return createAndAddRsmObservedDataFromFile(fileName, errorText);
|
||||||
|
}
|
||||||
|
else if (fileName.endsWith(".txt", Qt::CaseInsensitive) || fileName.endsWith(".csv", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
return createAndAddCvsObservedDataFromFile(fileName, errorText);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (errorText)
|
||||||
{
|
{
|
||||||
return createAndAddRsmObservedDataFromFile(file, errorText);
|
errorText->append("Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format or '*.txt' or '*.csv' if data is in CSV format.");
|
||||||
}
|
|
||||||
else if (fileName.endsWith(".txt", Qt::CaseInsensitive) || fileName.endsWith(".csv", Qt::CaseInsensitive))
|
|
||||||
{
|
|
||||||
return createAndAddCvsObservedDataFromFile(file, errorText);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (errorText)
|
|
||||||
{
|
|
||||||
errorText->append("Not able to import file. Make sure '*.rsm' is used as extension if data is in RMS format or '*.txt' or '*.csv' if data is in CSV format.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,20 +130,14 @@ std::vector<RimSummaryCase*> RimObservedDataCollection::allObservedData()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile(QFile& file, QString* errorText /*= nullptr*/)
|
RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText /*= nullptr*/)
|
||||||
{
|
{
|
||||||
RimObservedData* observedData = nullptr;
|
RimObservedData* observedData = nullptr;
|
||||||
|
|
||||||
if (!file.isOpen()) return nullptr;
|
|
||||||
|
|
||||||
QTextStream in(&file);
|
|
||||||
QString fileContents = in.readAll();
|
|
||||||
|
|
||||||
RimObservedEclipseUserData* columnBasedUserData = new RimObservedEclipseUserData();
|
RimObservedEclipseUserData* columnBasedUserData = new RimObservedEclipseUserData();
|
||||||
observedData = columnBasedUserData;
|
observedData = columnBasedUserData;
|
||||||
|
|
||||||
this->m_observedDataArray.push_back(observedData);
|
this->m_observedDataArray.push_back(observedData);
|
||||||
observedData->setSummaryHeaderFileName(file.fileName());
|
observedData->setSummaryHeaderFileName(fileName);
|
||||||
observedData->createSummaryReaderInterface();
|
observedData->createSummaryReaderInterface();
|
||||||
observedData->updateMetaData();
|
observedData->updateMetaData();
|
||||||
observedData->updateOptionSensitivity();
|
observedData->updateOptionSensitivity();
|
||||||
@@ -163,20 +155,29 @@ RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->updateConnectedEditors();
|
this->updateConnectedEditors();
|
||||||
|
|
||||||
return observedData;
|
return observedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(QFile& file, QString* errorText /*= nullptr*/)
|
RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText /*= nullptr*/)
|
||||||
{
|
{
|
||||||
RimObservedData* observedData = nullptr;
|
RimObservedData* observedData = nullptr;
|
||||||
|
QString fileContents;
|
||||||
|
|
||||||
if (!file.isOpen()) return nullptr;
|
{
|
||||||
|
QFile file(fileName);
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
{
|
||||||
|
RiaLogging::error(QString("Failed to open %1").arg(fileName));
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
QTextStream in(&file);
|
fileContents = file.readAll();
|
||||||
QString fileContents = in.readAll();
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi;
|
RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi;
|
||||||
parseOptionsUi.setPreviewText(fileContents);
|
parseOptionsUi.setPreviewText(fileContents);
|
||||||
@@ -193,7 +194,7 @@ RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(
|
|||||||
observedData = columnBasedUserData;
|
observedData = columnBasedUserData;
|
||||||
|
|
||||||
this->m_observedDataArray.push_back(observedData);
|
this->m_observedDataArray.push_back(observedData);
|
||||||
observedData->setSummaryHeaderFileName(file.fileName());
|
observedData->setSummaryHeaderFileName(fileName);
|
||||||
observedData->createSummaryReaderInterface();
|
observedData->createSummaryReaderInterface();
|
||||||
observedData->updateMetaData();
|
observedData->updateMetaData();
|
||||||
observedData->updateOptionSensitivity();
|
observedData->updateOptionSensitivity();
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ public:
|
|||||||
std::vector<RimSummaryCase*> allObservedData();
|
std::vector<RimSummaryCase*> allObservedData();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RimObservedData* createAndAddRsmObservedDataFromFile(QFile& file, QString* errorText = nullptr);
|
RimObservedData* createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText = nullptr);
|
||||||
RimObservedData* createAndAddCvsObservedDataFromFile(QFile& file, QString* errorText = nullptr);
|
RimObservedData* createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
caf::PdmChildArrayField<RimObservedData*> m_observedDataArray;
|
caf::PdmChildArrayField<RimObservedData*> m_observedDataArray;
|
||||||
|
|||||||
Reference in New Issue
Block a user