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:
parent
c959dbb850
commit
1d2067882d
@ -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_timeSteps.clear();
|
||||
@ -59,11 +59,10 @@ bool RifCsvUserData::parse(const QString& data, const AsciiDataParseOptions& par
|
||||
m_mapFromAddressToResultIndex.clear();
|
||||
|
||||
m_parser = std::unique_ptr<RifCsvUserDataParser>(new RifCsvUserDataParser(errorText));
|
||||
m_parser->parse(data, parseOptions);
|
||||
m_parser->parse(fileName, parseOptions);
|
||||
if (!m_parser)
|
||||
{
|
||||
RiaLogging::error(QString("Failed to parse file"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
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;
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
#include <QString>
|
||||
#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;
|
||||
int colCount = -1;
|
||||
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())
|
||||
{
|
||||
QString line = dataStream.readLine();
|
||||
@ -102,7 +110,8 @@ bool RifCsvUserDataParser::parseData(const QString& data, const AsciiDataParseOp
|
||||
else if(lineColumns.size() != colCount)
|
||||
{
|
||||
m_errorText->append("CSV file has invalid content (Column count mismatch)");
|
||||
return false;
|
||||
errors = true;
|
||||
break;
|
||||
}
|
||||
else if(parseState == FIRST_DATA_ROW)
|
||||
{
|
||||
@ -161,15 +170,21 @@ bool RifCsvUserDataParser::parseData(const QString& data, const AsciiDataParseOp
|
||||
catch (...)
|
||||
{
|
||||
m_errorText->append("CSV file has invalid content (Column type mismatch)");
|
||||
return false;
|
||||
errors = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TableData td("", "", cols);
|
||||
m_tableData = td;
|
||||
return true;
|
||||
file.close();
|
||||
|
||||
if (!errors)
|
||||
{
|
||||
TableData td("", "", cols);
|
||||
m_tableData = td;
|
||||
}
|
||||
return !errors;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -41,13 +41,13 @@ public:
|
||||
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 ColumnInfo* columnInfo(size_t columnIndex) const;
|
||||
|
||||
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);
|
||||
QDateTime tryParseDateTime(const std::string& colData, const QString& format);
|
||||
|
||||
|
@ -57,19 +57,8 @@ void RimCsvUserData::createSummaryReaderInterface()
|
||||
|
||||
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();
|
||||
if (csvUserData->parse(fileContents, m_parseOptions, &m_errorText))
|
||||
if (csvUserData->parse(this->summaryHeaderFilename(), m_parseOptions, &m_errorText))
|
||||
{
|
||||
m_summaryReader = csvUserData;
|
||||
}
|
||||
|
@ -84,33 +84,31 @@ RimObservedData* RimObservedDataCollection::createAndAddObservedDataFromFileName
|
||||
{
|
||||
RimObservedData* observedData = nullptr;
|
||||
|
||||
if (caf::Utils::fileExists(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);
|
||||
|
||||
if (errorText) errorText->append(s);
|
||||
|
||||
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);
|
||||
}
|
||||
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.");
|
||||
}
|
||||
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;
|
||||
|
||||
if (!file.isOpen()) return nullptr;
|
||||
|
||||
QTextStream in(&file);
|
||||
QString fileContents = in.readAll();
|
||||
|
||||
RimObservedEclipseUserData* columnBasedUserData = new RimObservedEclipseUserData();
|
||||
observedData = columnBasedUserData;
|
||||
|
||||
this->m_observedDataArray.push_back(observedData);
|
||||
observedData->setSummaryHeaderFileName(file.fileName());
|
||||
observedData->setSummaryHeaderFileName(fileName);
|
||||
observedData->createSummaryReaderInterface();
|
||||
observedData->updateMetaData();
|
||||
observedData->updateOptionSensitivity();
|
||||
@ -163,20 +155,29 @@ RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile(
|
||||
}
|
||||
|
||||
this->updateConnectedEditors();
|
||||
|
||||
return observedData;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(QFile& file, QString* errorText /*= nullptr*/)
|
||||
RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText /*= 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);
|
||||
QString fileContents = in.readAll();
|
||||
fileContents = file.readAll();
|
||||
file.close();
|
||||
}
|
||||
|
||||
RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi;
|
||||
parseOptionsUi.setPreviewText(fileContents);
|
||||
@ -193,7 +194,7 @@ RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(
|
||||
observedData = columnBasedUserData;
|
||||
|
||||
this->m_observedDataArray.push_back(observedData);
|
||||
observedData->setSummaryHeaderFileName(file.fileName());
|
||||
observedData->setSummaryHeaderFileName(fileName);
|
||||
observedData->createSummaryReaderInterface();
|
||||
observedData->updateMetaData();
|
||||
observedData->updateOptionSensitivity();
|
||||
|
@ -42,8 +42,8 @@ public:
|
||||
std::vector<RimSummaryCase*> allObservedData();
|
||||
|
||||
private:
|
||||
RimObservedData* createAndAddRsmObservedDataFromFile(QFile& file, QString* errorText = nullptr);
|
||||
RimObservedData* createAndAddCvsObservedDataFromFile(QFile& file, QString* errorText = nullptr);
|
||||
RimObservedData* createAndAddRsmObservedDataFromFile(const QString& fileName, QString* errorText = nullptr);
|
||||
RimObservedData* createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText = nullptr);
|
||||
|
||||
private:
|
||||
caf::PdmChildArrayField<RimObservedData*> m_observedDataArray;
|
||||
|
Loading…
Reference in New Issue
Block a user