From 2c41a0c898eb3ab997df98337131f862f68dcdc6 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Thu, 2 Jan 2025 23:19:59 +0800 Subject: [PATCH] tmp --- example/text_io_ex.cpp | 2 +- lib/io/dsv_io.cpp | 33 ++++++--------------- lib/io/dsv_io.h | 67 ++++++++++++++++++++++++++++++++---------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/example/text_io_ex.cpp b/example/text_io_ex.cpp index ed22339..4559ec1 100644 --- a/example/text_io_ex.cpp +++ b/example/text_io_ex.cpp @@ -83,7 +83,7 @@ int main(int argc, char const *argv[]) try tc.fill_row(array{5.5, 4.4, 3.3, 2.2, 1.1}, 3); geodsv_io out_table; - tc.filter("dist > 1000", {"dist"}, {"x (m)", "y (m)", "elev (m)"}, out_table); + tc.filt_column("dist > 1000", {"dist"}, {"x (m)", "y (m)", "elev (m)"}, out_table); out_table.save_text("out2"); _1s_vector s = tc.get_tags(); diff --git a/lib/io/dsv_io.cpp b/lib/io/dsv_io.cpp index 470f9bc..38a6fe5 100644 --- a/lib/io/dsv_io.cpp +++ b/lib/io/dsv_io.cpp @@ -348,8 +348,10 @@ void gctl::dsv_io::save_csv(std::string filename) return; } -void gctl::dsv_io::init_table(int row, int col, table_headtype_e t) +void gctl::dsv_io::init_table(int row, int col) { + if (!table_.empty()) clear(); + row_num_ = row; col_num_ = col; @@ -362,28 +364,6 @@ void gctl::dsv_io::init_table(int row, int col, table_headtype_e t) return; } -void gctl::dsv_io::init_table(const std::vector > &str_table, table_headtype_e t) -{ - row_num_ = str_table.size(); - col_num_ = str_table[0].size(); - - // 初始的列头和行头均为空白 - table_.resize(row_num_ + 1); - for (size_t i = 0; i < row_num_ + 1; i++) - { - table_[i].resize(col_num_ + 1); - } - - for (size_t i = 1; i <= row_num_; i++) - { - for (size_t j = 1; j <= col_num_; j++) - { - table_[i][j].str_ = str_table[i - 1][j - 1]; - } - } - return; -} - void gctl::dsv_io::info(table_headtype_e t) { std::clog << "File: " << file_ << "\n------------\n"; @@ -659,13 +639,18 @@ void gctl::dsv_io::cal_column(std::string expr_str, const std::vector &cnd_col, +void gctl::dsv_io::filt_column(std::string cnd_str, const std::vector &cnd_col, const std::vector &out_col, dsv_io& out_table) { array idx(cnd_col.size()); for (size_t i = 0; i < cnd_col.size(); i++) { idx[i] = name_index(cnd_col[i]); + + if (table_[0][idx[i]].type_ != Int && table_[0][idx[i]].type_ != Float) + { + throw std::runtime_error("[gctl::dsv_io] Invalid column type for numerical calculating."); + } } array odx(out_col.size()); diff --git a/lib/io/dsv_io.h b/lib/io/dsv_io.h index f789d07..92ca29e 100644 --- a/lib/io/dsv_io.h +++ b/lib/io/dsv_io.h @@ -352,17 +352,8 @@ namespace gctl * * @param row 数据行数 * @param col 数据列数 - * @param t 表格头类型 */ - void init_table(int row, int col, table_headtype_e t = ColumnHead); - - /** - * @brief 初始化表格 - * - * @param str_table 字符串表格 - * @param t 表格头类型 - */ - void init_table(const std::vector > &str_table, table_headtype_e t = ColumnHead); + void init_table(int row, int col); /** * @brief 返回表格信息 @@ -475,16 +466,25 @@ namespace gctl /** * @brief 按行过滤并返回符合条件的列数据 * + * @note 只有单元格类型为float和Int类型的列数据才能用于计算。计算由exprtk库完成,支持的表达式见其说明文档。 + * * @param cnd_str 条件表达式 * @param cnd_col 用于条件表达式的列索引列表 * @param out_col 输出的列索引列表,即条件判断为真是即筛选这些行与列上对应的数据 * @param out_table 输出的表格 */ - void filter(std::string cnd_str, const std::vector &cnd_col, + void filt_column(std::string cnd_str, const std::vector &cnd_col, const std::vector &out_col, dsv_io &out_table); #endif // GCTL_EXPRTK + /** + * @brief 初始化表格 + * + * @param data 向量表格 每行元素个数必须相等(不包含行与列的名称) + */ + template void init_table(const std::vector > &data, int p = 6); + /** * @brief 填充表格 * @@ -492,7 +492,7 @@ namespace gctl * @param data 矩阵数据 大小与表格一致 * @param p 浮点类数据保存时的有效数字位数 */ - template void fill_table(const matrix &data, int p = 6); + template void init_table(const matrix &data, int p = 6); /** * @brief 获取表格 @@ -601,11 +601,48 @@ namespace gctl }; template - void dsv_io::fill_table(const matrix &data, int p) + void dsv_io::init_table(const std::vector > &data, int p) { - for (size_t i = 1; i <= std::min(row_num_, (int) data.row_size()); i++) + if (!table_.empty()) clear(); + + row_num_ = data.size(); + col_num_ = data[0].size(); + + // 初始的列头和行头均为空白 + table_.resize(row_num_ + 1); + for (size_t i = 0; i < row_num_ + 1; i++) { - for (size_t j = 1; j <= std::min(col_num_, (int) data.col_size()); j++) + table_[i].resize(col_num_ + 1); + } + + for (size_t i = 1; i <= row_num_; i++) + { + for (size_t j = 1; j <= col_num_; j++) + { + table_[i][j].value(data[i - 1][j - 1], p); + } + } + return; + } + + template + void dsv_io::init_table(const matrix &data, int p) + { + if (!table_.empty()) clear(); + + row_num_ = data.row_size(); + col_num_ = data.col_size(); + + // 初始的列头和行头均为空白 + table_.resize(row_num_ + 1); + for (size_t i = 0; i < row_num_ + 1; i++) + { + table_[i].resize(col_num_ + 1); + } + + for (size_t i = 1; i <= row_num_; i++) + { + for (size_t j = 1; j <= col_num_; j++) { table_[i][j].value(data[i - 1][j - 1], p); }