From ad55ba233aca16aeebf886e5c4f81b10f9a08f90 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Sun, 26 Jan 2025 12:03:46 +0800 Subject: [PATCH] update dsv_io --- lib/io/dsv_io.cpp | 42 +++++++++++++++++++++++++++++++++--------- lib/io/dsv_io.h | 29 ++++++++++++++++------------- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/lib/io/dsv_io.cpp b/lib/io/dsv_io.cpp index dcb20ba..986b679 100644 --- a/lib/io/dsv_io.cpp +++ b/lib/io/dsv_io.cpp @@ -94,22 +94,46 @@ void gctl::dsv_io::get_column_names(std::vector &names) return; } -void gctl::dsv_io::set_row_names(const std::vector &names, std::string corner_name) +void gctl::dsv_io::set_row_names(const std::vector &names, const std::vector &idx, std::string corner_name) { - for (size_t i = 1; i <= std::min(row_num_, (int) names.size()); i++) + if (!idx.empty()) { - table_[i][0].str_ = names[i - 1]; + if (idx.size() != names.size()) throw std::runtime_error("[gctl::dsv_io] The size of idx and names must be the same."); + + for (size_t i = 0; i < names.size(); i++) + { + table_[idx[i]][0].str_ = names[i]; + } + } + else + { + for (size_t i = 1; i <= std::min(row_num_, (int) names.size()); i++) + { + table_[i][0].str_ = names[i - 1]; + } } table_[0][0].str_ = corner_name; return; } -void gctl::dsv_io::set_column_names(const std::vector &names) +void gctl::dsv_io::set_column_names(const std::vector &names, const std::vector &idx) { - for (size_t i = 1; i <= std::min(col_num_, (int) names.size()); i++) + if (!idx.empty()) { - table_[0][i].str_ = names[i - 1]; + if (idx.size() != names.size()) throw std::runtime_error("[gctl::dsv_io] The size of idx and names must be the same."); + + for (size_t i = 0; i < names.size(); i++) + { + table_[0][idx[i]].str_ = names[i]; + } + } + else + { + for (size_t i = 1; i <= std::min(col_num_, (int) names.size()); i++) + { + table_[0][i].str_ = names[i - 1]; + } } return; } @@ -674,7 +698,7 @@ void gctl::dsv_io::filt_column(std::string cnd_str, std::string cnd_col, } out_table.set_column_names(io_col); - out_table.set_row_names(row_names, table_[0][0].str_); + out_table.set_row_names(row_names, {}, table_[0][0].str_); destroy_vector(row_names); destroy_vector(io_col); @@ -749,7 +773,7 @@ void gctl::dsv_io::filt_column(rowbool_func_t func, const std::vector或列名称C指定相应的行或列 + * @brief DSV文本读写类型可以读写并处理一定格式保存的文本数据,具体的格式如下: + * 1. 所有以注释符(默认为#号)开始的行均会保存至注释变量内,可由用户提取; + * 2. 所有以标记符(默认为#!号)开始的行均会保存至标记变量内,可由用户提取; + * 3. 文件内可以包含n(默认为0)行不以注释或标记符开始头信息行,保存为头信息变量内,可由用户提取; + * 4. 注释、标记和头信息可出现在文本数据的任意行,且只有在头信息读入结束后才会开始读入数据; + * 5. 读入的表格保存为一个二维字符串数组,可由用户提取。浮点类型在读入/保存时可设置有效数字位数; + * 6. 若制定读入的数据表格存在行或列表头,则读入表格的第一列或第一行将被初始化为对应的行名称或列名称; + * 7. 表格的行与列数据可通过数字索引访问(从1开始计数),也可由具体的行或列名称指定; + * 8. 表格可识别内置的行与列名称(格式为为R和C),但不能用于输出文件。 */ class dsv_io { @@ -273,16 +273,19 @@ namespace gctl /** * @brief 设置行名称 * - * @param names 名称 + * @param names 名称数组 + * @param idx 索引数组(若为空则依次设置行名称) + * @param corner_name 表格左上角位置名称(默认为RowNames) */ - void set_row_names(const std::vector &names, std::string corner_name = "row-idx"); + void set_row_names(const std::vector &names, const std::vector &idx = {}, std::string corner_name = "RowNames"); /** * @brief 设置列名称 * - * @param names 名称 + * @param names 名称数组 + * @param idx 索引数组(若为空则依次设置行名称) */ - void set_column_names(const std::vector &names); + void set_column_names(const std::vector &names, const std::vector &idx = {}); /** * @brief 设置行类型