code changes in load
This commit is contained in:
97
table.cpp
97
table.cpp
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user