#2018 CSV import. Modify CSV parser interface. Optimization.

This commit is contained in:
Bjørn Erik Jensen 2017-11-24 13:53:32 +01:00
parent 3872be8f35
commit 800ac30d81
3 changed files with 45 additions and 52 deletions

View File

@ -288,12 +288,11 @@ QList<caf::PdmOptionItemInfo> RicPasteAsciiDataToSummaryPlotFeatureUi::calculate
if (fieldNeedingOptions == &m_timeSeriesColumnName)
{
std::vector<QString> columnNames;
const std::vector<ColumnInfo>& columnInfoList = m_parser->tableData().columnInfos();
m_parser->parseColumnNames(parseOptions().cellSeparator, &columnNames);
for (const QString& columnName : columnNames)
for (const ColumnInfo& columnInfo : columnInfoList)
{
QString columnName = QString::fromStdString(columnInfo.summaryAddress.quantityName());
options.push_back(caf::PdmOptionItemInfo(columnName, columnName));
}
}
@ -320,17 +319,18 @@ void RicPasteAsciiDataToSummaryPlotFeatureUi::defineEditorAttribute(const caf::P
//--------------------------------------------------------------------------------------------------
void RicPasteAsciiDataToSummaryPlotFeatureUi::initialize(RifCsvUserDataParser* parser)
{
CVF_ASSERT(parser);
QString cellSep = parser->tryDetermineCellSeparator();
if (!cellSep.isEmpty())
{
m_cellSeparator = mapCellSeparator(cellSep);
}
std::vector<QString> columnNames;
parser->parseColumnNames(parseOptions().cellSeparator, &columnNames);
if (columnNames.size() > 0)
parser->parseColumnInfo(parseOptions().cellSeparator);
if (parser->tableData().columnInfos().size() > 0)
{
m_timeSeriesColumnName = columnNames[0];
m_timeSeriesColumnName = QString::fromStdString(parser->tableData().columnInfos()[0].summaryAddress.quantityName());
}
m_previewText = parser->previewText();

View File

@ -80,16 +80,16 @@ const ColumnInfo* RifCsvUserDataParser::columnInfo(size_t columnIndex) const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifCsvUserDataParser::parseColumnNames(const QString& cellSeparator,
std::vector<QString>* columnNames)
bool RifCsvUserDataParser::parseColumnInfo(const QString& cellSeparator)
{
if (!columnNames) return false;
columnNames->clear();
QTextStream* dataStream = openDataStream();
bool result = parseColumnHeader(dataStream, cellSeparator, columnNames);
std::vector<ColumnInfo> columnInfoList;
bool result = parseColumnInfo(dataStream, cellSeparator, &columnInfoList);
if (result)
{
m_tableData = TableData("", "", columnInfoList);
}
closeDataStream();
return result;
}
@ -124,13 +124,13 @@ QString RifCsvUserDataParser::previewText()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifCsvUserDataParser::parseColumnHeader(QTextStream* dataStream, const QString& cellSeparator, std::vector<QString>* columnNames)
bool RifCsvUserDataParser::parseColumnInfo(QTextStream* dataStream, const QString& cellSeparator, std::vector<ColumnInfo>* columnInfoList)
{
if (!columnNames) return false;
columnNames->clear();
bool headerFound = false;
if (!columnInfoList) return false;
columnInfoList->clear();
while (!headerFound)
{
QString line = dataStream->readLine();
@ -142,7 +142,11 @@ bool RifCsvUserDataParser::parseColumnHeader(QTextStream* dataStream, const QStr
for (int iCol = 0; iCol < colCount; iCol++)
{
columnNames->push_back(lineColumns[iCol]);
QString colName = lineColumns[iCol];
RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::importedAddress(colName.toStdString());
ColumnInfo col = ColumnInfo::createColumnInfoFromCsvData(addr, "");
columnInfoList->push_back(col);
}
headerFound = true;
}
@ -158,35 +162,18 @@ bool RifCsvUserDataParser::parseData(const AsciiDataParseOptions& parseOptions)
bool errors = false;
enum { FIRST_DATA_ROW, DATA_ROW } parseState = FIRST_DATA_ROW;
int colCount;
std::vector<ColumnInfo> cols;
std::vector<ColumnInfo> columnInfoList;
QTextStream* dataStream = openDataStream();
// Parse header
std::vector<QString> columnNames;
if (parseColumnHeader(dataStream, parseOptions.cellSeparator, &columnNames))
{
colCount = (int)columnNames.size();
for (int iCol = 0; iCol < colCount; iCol++)
{
QString colName = columnNames[iCol];
RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::importedAddress(colName.toStdString());
ColumnInfo col = ColumnInfo::createColumnInfoFromCsvData(addr, "");
if (colName == parseOptions.timeSeriesColumnName)
{
col.dataType = ColumnInfo::DATETIME;
}
cols.push_back(col);
}
}
else
if (!parseColumnInfo(dataStream, parseOptions.cellSeparator, &columnInfoList))
{
m_errorText->append("Failed to parse column headers");
return false;
}
colCount = (int)columnInfoList.size();
while (!dataStream->atEnd() && !errors)
{
QString line = dataStream->readLine();
@ -205,18 +192,25 @@ bool RifCsvUserDataParser::parseData(const AsciiDataParseOptions& parseOptions)
for (int iCol = 0; iCol < colCount; iCol++)
{
std::string colData = lineColumns[iCol].toStdString();
ColumnInfo& col = cols[iCol];
ColumnInfo& col = columnInfoList[iCol];
// Determine column data type
if (col.dataType == ColumnInfo::NONE)
{
if (RiaStdStringTools::isNumber(colData, parseOptions.locale.decimalPoint().toAscii()))
if (QString::fromStdString(col.summaryAddress.quantityName()) == parseOptions.timeSeriesColumnName)
{
col.dataType = ColumnInfo::NUMERIC;
col.dataType = ColumnInfo::DATETIME;
}
else
{
col.dataType = ColumnInfo::TEXT;
if (RiaStdStringTools::isNumber(colData, parseOptions.locale.decimalPoint().toAscii()))
{
col.dataType = ColumnInfo::NUMERIC;
}
else
{
col.dataType = ColumnInfo::TEXT;
}
}
}
}
@ -229,7 +223,7 @@ bool RifCsvUserDataParser::parseData(const AsciiDataParseOptions& parseOptions)
for (int iCol = 0; iCol < colCount; iCol++)
{
QString& colData = lineColumns[iCol];
ColumnInfo& col = cols[iCol];
ColumnInfo& col = columnInfoList[iCol];
try
{
@ -270,7 +264,7 @@ bool RifCsvUserDataParser::parseData(const AsciiDataParseOptions& parseOptions)
if (!errors)
{
TableData td("", "", cols);
TableData td("", "", columnInfoList);
m_tableData = td;
}
return !errors;

View File

@ -47,8 +47,7 @@ public:
const ColumnInfo* columnInfo(size_t columnIndex) const;
bool parseColumnNames(const QString& cellSeparator,
std::vector<QString>* columnNames);
bool parseColumnInfo(const QString& cellSeparator);
QString previewText();
QString tryDetermineCellSeparator();
@ -58,9 +57,9 @@ protected:
virtual void closeDataStream() = 0;
private:
bool parseColumnHeader(QTextStream* dataStream,
const QString& cellSeparator,
std::vector<QString>* columnNames);
bool parseColumnInfo(QTextStream* dataStream,
const QString& cellSeparator,
std::vector<ColumnInfo>* columnInfoList);
bool parseData(const AsciiDataParseOptions& parseOptions);
QString columnifyText(const QString& text);
static QStringList splitLineAndTrim(const QString& line, const QString& separator);