diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp index efe71d8c43..bb546e7ec3 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp @@ -85,7 +85,7 @@ void RicPasteAsciiDataToSummaryPlotFeature::onActionTriggered(bool isChecked) RicPasteAsciiDataToSummaryPlotFeatureUi pasteOptions; if (!summaryPlot) pasteOptions.createNewPlot(); - pasteOptions.setPreviewText(text); + pasteOptions.setUiModePasteText(text); caf::PdmSettings::readFieldsFromApplicationStore(&pasteOptions); caf::PdmUiPropertyViewDialog propertyDialog(NULL, &pasteOptions, "Set Paste Options", ""); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp index b783491ea8..53956d2a60 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp @@ -18,7 +18,10 @@ #include "RicPasteAsciiDataToSummaryPlotFeatureUi.h" +#include "RifCsvUserDataParser.h" + #include "cafPdmUiTextEditor.h" +#include "cafPdmUiItem.h" namespace caf { @@ -60,6 +63,23 @@ namespace caf { CAF_PDM_SOURCE_INIT(RicPasteAsciiDataToSummaryPlotFeatureUi, "RicPasteAsciiDataToSummaryPlotFeatureUi"); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicPasteAsciiDataToSummaryPlotFeatureUi::CellSeparator mapCellSeparator(const QString& sep) +{ + if (sep == "\t") return RicPasteAsciiDataToSummaryPlotFeatureUi::CELL_TAB; + if (sep == ";") return RicPasteAsciiDataToSummaryPlotFeatureUi::CELL_SEMICOLON; + if (sep == ",") return RicPasteAsciiDataToSummaryPlotFeatureUi::CELL_COMMA; + + return RicPasteAsciiDataToSummaryPlotFeatureUi::CELL_TAB; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- + + //-------------------------------------------------------------------------------------------------- /// @@ -84,12 +104,38 @@ RicPasteAsciiDataToSummaryPlotFeatureUi::RicPasteAsciiDataToSummaryPlotFeatureUi CAF_PDM_InitFieldNoDefault(&m_cellSeparator, "CellSeparator", "Cell Separator", "", "", ""); + CAF_PDM_InitFieldNoDefault(&m_timeSeriesColumnName, "TimeSeriesColumn", "Time Series Column", "", "", ""); + CAF_PDM_InitFieldNoDefault(&m_previewText, "PreviewText", "Preview Text", "", "", ""); m_previewText.uiCapability()->setUiEditorTypeName(caf::PdmUiTextEditor::uiEditorTypeName()); m_previewText.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN); m_previewText.uiCapability()->setUiReadOnly(true); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPasteAsciiDataToSummaryPlotFeatureUi::setUiModeImport(const QString& fileName) +{ + m_uiMode = UI_MODE_IMPORT; + m_fileName = fileName; + + RifCsvUserDataFileParser parser(fileName); + m_previewText = parser.previewText(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPasteAsciiDataToSummaryPlotFeatureUi::setUiModePasteText(const QString& text) +{ + m_uiMode = UI_MODE_PASTE; + m_pastedText = text; + + RifCsvUserDataPastedTextParser parser(text); + m_previewText = parser.previewText(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -131,6 +177,8 @@ const AsciiDataParseOptions RicPasteAsciiDataToSummaryPlotFeatureUi::parseOption parseOptions.dateFormat = dateFormat; } + parseOptions.timeSeriesColumnName = m_timeSeriesColumnName(); + parseOptions.timeFormat = m_timeFormat() != TIME_NONE ? m_timeFormat().text() : QString(""); { @@ -168,19 +216,12 @@ void RicPasteAsciiDataToSummaryPlotFeatureUi::createNewPlot() m_createNewPlot = true; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicPasteAsciiDataToSummaryPlotFeatureUi::setPreviewText(const QString& previewText) -{ - m_previewText = previewText; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RicPasteAsciiDataToSummaryPlotFeatureUi::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) { + if(m_uiMode == UI_MODE_PASTE) { caf::PdmUiGroup* namingGroup = uiOrdering.addNewGroup("Naming"); if (m_createNewPlot) @@ -197,6 +238,8 @@ void RicPasteAsciiDataToSummaryPlotFeatureUi::defineUiOrdering(QString uiConfigN { caf::PdmUiGroup* dateGroup = uiOrdering.addNewGroup("Dates"); + dateGroup->add(&m_timeSeriesColumnName); + dateGroup->add(&m_useCustomDateFormat); if (m_useCustomDateFormat()) { @@ -215,6 +258,7 @@ void RicPasteAsciiDataToSummaryPlotFeatureUi::defineUiOrdering(QString uiConfigN cellGroup->add(&m_cellSeparator); } + if(m_uiMode == UI_MODE_PASTE) { caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup("Appearance"); @@ -232,6 +276,53 @@ void RicPasteAsciiDataToSummaryPlotFeatureUi::defineUiOrdering(QString uiConfigN uiOrdering.skipRemainingFields(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RicPasteAsciiDataToSummaryPlotFeatureUi::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly) +{ + QList options; + + if (fieldNeedingOptions == &m_timeSeriesColumnName) + { + QString cellSep; + RifCsvUserDataParser* parser; + + if (m_uiMode == UI_MODE_IMPORT) + { + parser = new RifCsvUserDataFileParser(m_fileName); + } + else + { + parser = new RifCsvUserDataPastedTextParser(m_pastedText); + } + + cellSep = parser->tryDetermineCellSeparator(); + if (!cellSep.isEmpty()) + { + m_cellSeparator = mapCellSeparator(cellSep); + } + + std::vector columnNames; + if (parser->parseColumnNames(parseOptions().cellSeparator, &columnNames)) + { + for (const QString& columnName : columnNames) + { + options.push_back(caf::PdmOptionItemInfo(columnName, columnName)); + } + + if (columnNames.size() > 0) + { + m_timeSeriesColumnName = columnNames.front(); + } + } + + delete parser; + } + return options; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.h b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.h index a78d079e01..5ce81f9cbd 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeatureUi.h @@ -39,6 +39,7 @@ public: QString dateFormat; QString timeFormat; QString cellSeparator; + QString timeSeriesColumnName; RimPlotCurve::LineStyleEnum curveLineStyle; RimPlotCurve::PointSymbolEnum curveSymbol; @@ -56,6 +57,12 @@ class RicPasteAsciiDataToSummaryPlotFeatureUi : public caf::PdmObject CAF_PDM_HEADER_INIT; public: + enum UiMode + { + UI_MODE_IMPORT, + UI_MODE_PASTE + }; + enum DecimalSeparator { DECIMAL_COMMA, @@ -93,15 +100,20 @@ public: public: RicPasteAsciiDataToSummaryPlotFeatureUi(); + void setUiModeImport(const QString& fileName); + void setUiModePasteText(const QString& text); + const AsciiDataParseOptions parseOptions() const; void createNewPlot(); - void setPreviewText(const QString& text); protected: - virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; - virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override; + virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; + virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override; + virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override; private: + UiMode m_uiMode; + caf::PdmField m_plotTitle; caf::PdmField m_curvePrefix; caf::PdmField m_decimalSeparator; @@ -110,6 +122,7 @@ private: caf::PdmField m_useCustomDateFormat; caf::PdmField m_customDateFormat; caf::PdmField m_cellSeparator; + caf::PdmField m_timeSeriesColumnName; caf::PdmField> m_curveLineStyle; caf::PdmField> m_curveSymbol; @@ -117,4 +130,8 @@ private: bool m_createNewPlot; caf::PdmField m_previewText; + + // Data source + QString m_fileName; + QString m_pastedText; }; diff --git a/ApplicationCode/FileInterface/RifCsvUserData.cpp b/ApplicationCode/FileInterface/RifCsvUserData.cpp index 4302af5ee7..799cabae55 100644 --- a/ApplicationCode/FileInterface/RifCsvUserData.cpp +++ b/ApplicationCode/FileInterface/RifCsvUserData.cpp @@ -58,8 +58,8 @@ bool RifCsvUserData::parse(const QString& fileName, const AsciiDataParseOptions& m_mapFromAddressToTimeStepIndex.clear(); m_mapFromAddressToResultIndex.clear(); - m_parser = std::unique_ptr(new RifCsvUserDataParser(errorText)); - m_parser->parse(fileName, parseOptions); + m_parser = std::unique_ptr(new RifCsvUserDataFileParser(fileName, errorText)); + m_parser->parse(parseOptions); if (!m_parser) { RiaLogging::error(QString("Failed to parse file")); diff --git a/ApplicationCode/FileInterface/RifCsvUserDataParser.cpp b/ApplicationCode/FileInterface/RifCsvUserDataParser.cpp index 4a9194cc09..b4ba155e2b 100644 --- a/ApplicationCode/FileInterface/RifCsvUserDataParser.cpp +++ b/ApplicationCode/FileInterface/RifCsvUserDataParser.cpp @@ -35,8 +35,8 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifCsvUserDataParser::RifCsvUserDataParser(QString* errorText) - : m_errorText(errorText) +RifCsvUserDataParser::RifCsvUserDataParser(QString* errorText) : + m_errorText(errorText) { } @@ -44,9 +44,16 @@ RifCsvUserDataParser::RifCsvUserDataParser(QString* errorText) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifCsvUserDataParser::parse(const QString& fileName, const AsciiDataParseOptions& parseOptions) +RifCsvUserDataParser::~RifCsvUserDataParser() { - return parseData(fileName, parseOptions); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifCsvUserDataParser::parse(const AsciiDataParseOptions& parseOptions) +{ + return parseData(parseOptions); } //-------------------------------------------------------------------------------------------------- @@ -71,43 +78,116 @@ const ColumnInfo* RifCsvUserDataParser::columnInfo(size_t columnIndex) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifCsvUserDataParser::parseData(const QString& fileName, const AsciiDataParseOptions& parseOptions) +bool RifCsvUserDataParser::parseColumnNames(const QString& cellSeparator, + std::vector* columnNames) +{ + if (!columnNames) return false; + + columnNames->clear(); + + QTextStream* dataStream = openDataStream(); + bool result = parseColumnHeader(dataStream, cellSeparator, columnNames); + + closeDataStream(); + return result; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifCsvUserDataParser::previewText() +{ + QTextStream *stream = openDataStream(); + + if (!stream) return ""; + + QString preview; + QTextStream outStream(&preview); + int iLine = 0; + + while (iLine < 30 + 1 && !stream->atEnd()) + { + QString line = stream->readLine(); + + if (line.isEmpty()) continue; + + outStream << line; + outStream << "\n"; + iLine++; + } + closeDataStream(); + return columnifyText(preview); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifCsvUserDataParser::parseColumnHeader(QTextStream* dataStream, const QString& cellSeparator, std::vector* columnNames) +{ + if (!columnNames) return false; + + columnNames->clear(); + + bool headerFound = false; + while (!headerFound) + { + QString line = dataStream->readLine(); + if (line.trimmed().isEmpty()) continue; + + QStringList lineColumns = splitLineAndTrim(line, cellSeparator); + + int colCount = lineColumns.size(); + + for (int iCol = 0; iCol < colCount; iCol++) + { + columnNames->push_back(lineColumns[iCol]); + } + headerFound = true; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifCsvUserDataParser::parseData(const AsciiDataParseOptions& parseOptions) { bool errors = false; - enum { HEADER_ROW, FIRST_DATA_ROW, DATA_ROW } parseState = HEADER_ROW; - int colCount = -1; + enum { FIRST_DATA_ROW, DATA_ROW } parseState = FIRST_DATA_ROW; + int colCount; std::vector cols; - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + QTextStream* dataStream = openDataStream(); + + // Parse header + std::vector columnNames; + if (parseColumnHeader(dataStream, parseOptions.cellSeparator, &columnNames)) { - RiaLogging::error(QString("Failed to open %1").arg(fileName)); + colCount = (int)columnNames.size(); + + for (int iCol = 0; iCol < colCount; iCol++) + { + std::string colName = columnNames[iCol].toStdString(); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::importedAddress(colName); + ColumnInfo col = ColumnInfo::createColumnInfoFromCsvData(addr, ""); + cols.push_back(col); + } + } + else + { + m_errorText->append("Failed to parse column headers"); return false; } - QTextStream dataStream(&file); - while (!dataStream.atEnd()) + while (!dataStream->atEnd()) { - QString line = dataStream.readLine(); + QString line = dataStream->readLine(); if(line.trimmed().isEmpty()) continue; QStringList lineColumns = splitLineAndTrim(line, parseOptions.cellSeparator); - if (parseState == HEADER_ROW) - { - colCount = lineColumns.size(); - - for (int iCol = 0; iCol < colCount; iCol++) - { - std::string colName = lineColumns[iCol].toStdString(); - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::importedAddress(colName); - ColumnInfo col = ColumnInfo::createColumnInfoFromCsvData(addr, ""); - cols.push_back(col); - } - - parseState = FIRST_DATA_ROW; - } - else if(lineColumns.size() != colCount) + if(lineColumns.size() != colCount) { m_errorText->append("CSV file has invalid content (Column count mismatch)"); errors = true; @@ -177,7 +257,7 @@ bool RifCsvUserDataParser::parseData(const QString& fileName, const AsciiDataPar } } - file.close(); + closeDataStream(); if (!errors) { @@ -187,6 +267,25 @@ bool RifCsvUserDataParser::parseData(const QString& fileName, const AsciiDataPar return !errors; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifCsvUserDataParser::columnifyText(const QString& text) +{ + QString pretty = text; + + QString cellSep = tryDetermineCellSeparator(); + if (!cellSep.isEmpty()) + { + if (cellSep == ";" || cellSep == ",") + { + pretty = pretty.replace(cellSep, QString("\t") + cellSep); + } + } + + return pretty; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -207,3 +306,172 @@ QDateTime RifCsvUserDataParser::tryParseDateTime(const std::string& colData, con { return RiaQDateTimeTools::fromString(QString::fromStdString(colData), format); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifCsvUserDataParser::tryDetermineCellSeparator() +{ + QTextStream* dataStream = openDataStream(); + std::vector lines; + int iLine = 0; + + while(iLine < 10 && !dataStream->atEnd()) + { + QString line = dataStream->readLine(); + if(line.isEmpty()) continue; + + lines.push_back(line); + iLine++; + } + closeDataStream(); + + // Try different cell separators + int totColumnCountTab = 0; + int totColumnCountSemicolon = 0; + int totColumnCountComma = 0; + + for (const QString& line : lines) + { + totColumnCountTab += splitLineAndTrim(line, "\t").size(); + totColumnCountSemicolon += splitLineAndTrim(line, ";").size(); + totColumnCountComma += splitLineAndTrim(line, ",").size(); + } + + double avgColumnCountTab = (double)totColumnCountTab / lines.size(); + double avgColumnCountSemicolon = (double)totColumnCountSemicolon / lines.size(); + double avgColumnCountComma = (double)totColumnCountComma / lines.size(); + + // Select the one having highest average + double maxAvg = std::max(std::max(avgColumnCountTab, avgColumnCountSemicolon), avgColumnCountComma); + + if (maxAvg == avgColumnCountTab) return "\t"; + if (maxAvg == avgColumnCountSemicolon) return ";"; + if (maxAvg == avgColumnCountComma) return ","; + return ""; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifCsvUserDataFileParser::RifCsvUserDataFileParser(const QString& fileName, QString* errorText) : + RifCsvUserDataParser(errorText) +{ + m_fileName = fileName; + m_file = nullptr; + m_textStream = nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifCsvUserDataFileParser::~RifCsvUserDataFileParser() +{ + if (m_textStream) + { + delete m_textStream; + } + closeFile(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QTextStream* RifCsvUserDataFileParser::openDataStream() +{ + if (!openFile()) return nullptr; + + m_textStream = new QTextStream(m_file); + return m_textStream; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifCsvUserDataFileParser::closeDataStream() +{ + if (m_textStream) + { + delete m_textStream; + m_textStream = nullptr; + } + closeFile(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifCsvUserDataFileParser::openFile() +{ + if (!m_file) + { + m_file = new QFile(m_fileName); + if (!m_file->open(QIODevice::ReadOnly | QIODevice::Text)) + { + RiaLogging::error(QString("Failed to open %1").arg(m_fileName)); + + delete m_file; + return false; + } + } + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifCsvUserDataFileParser::closeFile() +{ + if (m_file) + { + m_file->close(); + delete m_file; + m_file = nullptr; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifCsvUserDataPastedTextParser::RifCsvUserDataPastedTextParser(const QString& text, QString* errorText): + RifCsvUserDataParser(errorText) +{ + m_text = text; + m_textStream = nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifCsvUserDataPastedTextParser::~RifCsvUserDataPastedTextParser() +{ + if (m_textStream) + { + delete m_textStream; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QTextStream* RifCsvUserDataPastedTextParser::openDataStream() +{ + if (m_textStream) + { + delete m_textStream; + } + m_textStream = new QTextStream(&m_text); + return m_textStream; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifCsvUserDataPastedTextParser::closeDataStream() +{ + if (m_textStream) + { + delete m_textStream; + m_textStream = nullptr; + } +} \ No newline at end of file diff --git a/ApplicationCode/FileInterface/RifCsvUserDataParser.h b/ApplicationCode/FileInterface/RifCsvUserDataParser.h index 62359d729a..d28f832c9d 100644 --- a/ApplicationCode/FileInterface/RifCsvUserDataParser.h +++ b/ApplicationCode/FileInterface/RifCsvUserDataParser.h @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include @@ -39,19 +41,75 @@ class RifCsvUserDataParser { public: RifCsvUserDataParser(QString* errorText = nullptr); + virtual ~RifCsvUserDataParser(); - - bool parse(const QString& fileName, const AsciiDataParseOptions& parseOptions); + bool parse(const AsciiDataParseOptions& parseOptions); const TableData& tableData() const; const ColumnInfo* columnInfo(size_t columnIndex) const; + bool parseColumnNames(const QString& cellSeparator, + std::vector* columnNames); + QString previewText(); + + QString tryDetermineCellSeparator(); + +protected: + virtual QTextStream* openDataStream() = 0; + virtual void closeDataStream() = 0; + private: - 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); + bool parseColumnHeader(QTextStream* dataStream, + const QString& cellSeparator, + std::vector* columnNames); + bool parseData(const AsciiDataParseOptions& parseOptions); + QString columnifyText(const QString& text); + static QStringList splitLineAndTrim(const QString& line, const QString& separator); + static QDateTime tryParseDateTime(const std::string& colData, const QString& format); private: TableData m_tableData; QString* m_errorText; }; + +//================================================================================================== +/// +//================================================================================================== +class RifCsvUserDataFileParser : public RifCsvUserDataParser +{ +public: + RifCsvUserDataFileParser(const QString& fileName, QString* errorText = nullptr); + virtual ~RifCsvUserDataFileParser(); + +protected: + virtual QTextStream* openDataStream() override; + virtual void closeDataStream() override; + +private: + bool openFile(); + void closeFile(); + +private: + QString m_fileName; + QFile* m_file; + QTextStream* m_textStream; +}; + +//================================================================================================== +/// +//================================================================================================== + +class RifCsvUserDataPastedTextParser : public RifCsvUserDataParser +{ +public: + RifCsvUserDataPastedTextParser(const QString& text, QString* errorText = nullptr); + virtual ~RifCsvUserDataPastedTextParser(); + +protected: + virtual QTextStream* openDataStream() override; + virtual void closeDataStream() override; + +private: + QString m_text; + QTextStream* m_textStream; +}; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp index f363f8046a..f0d01f812b 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimObservedDataCollection.cpp @@ -165,22 +165,9 @@ RimObservedData* RimObservedDataCollection::createAndAddRsmObservedDataFromFile( RimObservedData* RimObservedDataCollection::createAndAddCvsObservedDataFromFile(const QString& fileName, QString* errorText /*= nullptr*/) { RimObservedData* observedData = nullptr; - QString fileContents; - - { - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - RiaLogging::error(QString("Failed to open %1").arg(fileName)); - return nullptr; - } - - fileContents = file.readAll(); - file.close(); - } RicPasteAsciiDataToSummaryPlotFeatureUi parseOptionsUi; - parseOptionsUi.setPreviewText(fileContents); + parseOptionsUi.setUiModeImport(fileName); caf::PdmSettings::readFieldsFromApplicationStore(&parseOptionsUi); caf::PdmUiPropertyViewDialog propertyDialog(NULL, &parseOptionsUi, "CSV Import Options", "");