code changes in load

This commit is contained in:
2021-08-13 10:24:04 +02:00
parent cd92e27270
commit e53d062ff5
10 changed files with 287 additions and 141 deletions

View File

@@ -3,6 +3,8 @@
#include "csvreader.h"
#include "ml_string.h"
#include <fstream>
#include <algorithm>
namespace usql {
@@ -70,47 +72,70 @@ std::string Table::csv_string() {
}
int Table::load_csv_string(const std::string &content) {
int row_cnt = 0;
std::vector<ColDefNode> &colDefs = m_col_defs;
CsvReader csvparser{};
auto csv = csvparser.parseCSV(content);
std::vector<ColDefNode> &colDefs = m_col_defs;
for (auto it = csv.begin() + 1; it != csv.end(); ++it) {
std::vector<std::string> &csv_line = *it;
// prepare empty new_row
Row& new_row = create_empty_row();
// copy values
for (size_t i = 0; i < columns_count(); i++) {
ColDefNode col_def = get_column_def(colDefs[i].name);
if (csv_line[i].empty()) {
new_row.setColumnNull(col_def.order);
} else if (col_def.type == ColumnType::integer_type) {
new_row.setIntColumnValue(col_def.order, string_to_long(csv_line[i]));
} else if (col_def.type == ColumnType::float_type) {
new_row.setFloatColumnValue(col_def.order, string_to_double(csv_line[i]));
} else if (col_def.type == ColumnType::varchar_type) {
new_row.setStringColumnValue(col_def.order, csv_line[i]);
} else if (col_def.type == ColumnType::date_type) {
new_row.setDateColumnValue(col_def.order, csv_line[i]);
} else if (col_def.type == ColumnType::bool_type) {
new_row.setBoolColumnValue(col_def.order, csv_line[i]);
} else
throw Exception("unsupported column type");
}
// append new_row
commit_row(new_row);
row_cnt++;
}
int row_cnt = csvparser.parseCSV2(content, colDefs, *this);
return row_cnt;
}
int Table::load_csv_file(const std::string &filename) {
std::vector<ColDefNode> &colDefs = m_col_defs;
// allocate enough space
int line_size = 128;
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
auto file_size = in.tellg();
std::ifstream infile(filename);
if (infile.good()) {
std::string sLine;
std::getline(infile, sLine);
line_size = sLine.size();
}
infile.close();
if (file_size > 0) {
m_rows.reserve(m_rows.size() + int(file_size / line_size * 1.1));
}
// load rows
CsvReader csvparser{};
int row_cnt = csvparser.parseCSV(filename, colDefs, *this);
return row_cnt;
}
void Table::create_row_from_vector(const std::vector<ColDefNode> &colDefs, const std::vector<std::string> &csv_line) {
// prepare empty new_row
Row& new_row = create_empty_row();
// copy values
for (size_t i = 0; i < std::min<int>(columns_count(), csv_line.size()); i++) {
const ColDefNode & col_def = colDefs[i];
if (csv_line[i].empty()) {
new_row.setColumnNull(col_def.order);
} else if (col_def.type == ColumnType::integer_type) {
new_row.setIntColumnValue(col_def.order, string_to_long(csv_line[i]));
} else if (col_def.type == ColumnType::float_type) {
new_row.setFloatColumnValue(col_def.order, string_to_double(csv_line[i]));
} else if (col_def.type == ColumnType::varchar_type) {
new_row.setStringColumnValue(col_def.order, csv_line[i]);
} else if (col_def.type == ColumnType::date_type) {
new_row.setDateColumnValue(col_def.order, csv_line[i]);
} else if (col_def.type == ColumnType::bool_type) {
new_row.setBoolColumnValue(col_def.order, csv_line[i]);
} else
throw Exception("unsupported column type");
}
// append new_row
commit_row(new_row);
}
double Table::string_to_double(const std::string &s) {
try {
return std::stod(s);
@@ -214,4 +239,4 @@ void Table::validate_row(const Row &row) {
}
}
} // namespace
} // namespace