dsv_table: 一文看懂 C++ 高性能表格数据处理

引言 在科学计算、数据分析和工程应用中,表格数据(如 CSV、TSV、空格分隔文件)是最常见的数据格式之一。然而,C++ 标准库并未提供开箱即用的表格处理工具,开发者往往需要自己编写解析逻辑,处理分隔符、表头、注释、空值等琐碎问题。 dsv_table 是 utilsxx 库中的一个核心组件,它提供了一套完整的表格数据读写与操作方案,支持多种分隔格式、灵活的行列访问、数据过滤与排序,以及 JSON 互操作。本文将带你从零开始,一文看懂 dsv_table 的设计理念与使用技巧。 一、什么是 dsv_table? dsv_table 中的 DSV 是 Delimiter-Separated Values 的缩写,泛指所有以分隔符(逗号、空格、竖线等)组织的文本表格格式。dsv_table 不仅能处理 CSV,还能处理任意自定义分隔符的文本文件。 核心设计特点 特性 说明 统一存储 所有单元格内部以字符串存储,支持按需转换为 int、double、std::string 类型标记 每个单元格带有 String / Int / Float 类型标记,影响输出行为 输出控制 可单独控制行/列/单元格的输出开关(Enable/Disable),实现"软删除" 行列命名 支持通过名称(如 "SurfaceArea_n")或内置编号(如 R3、C5)访问 多格式支持 原生支持 .txt、.csv、.json 的读写 头信息/注释/标记 文件中的注释行、标记行、头信息行会被自动提取并保留 二、快速上手 2.1 基本加载与查看 假设我们有一个 CSV 文件 sample_data.csv: id,lon,lat,depth,den,sus,name,date,location ,32.23,65.23,,2.3,,gabbro,,"enshi, hubei" ,65.2,12.7,,2.5,,basalt,,"wuhan" ,70.23,10.6,,3.1,,volcanic,,"hangzhou, zhejiang" 加载并查看列信息: #include "dsv_table.hpp" int main() { utilsxx::dsv_table t("data/sample_data", ".csv"); t.info(utilsxx::ColInfo); // 打印列信息 return 0; } 输出示例: ...

May 10, 2026 · 张壹

get_option: C++ 配置文件解析,一文从入门到精通

引言 几乎每个非平凡的程序都需要配置参数:输入文件路径、算法阈值、输出格式、模型参数……硬编码这些值会让程序失去灵活性,而手写解析逻辑又繁琐且容易出错。 getoption 是 utilsxx 库中的轻量级配置解析组件。它采用声明式设计理念:你先声明程序需要哪些参数、哪些是必填的、哪些参数属于互斥组,然后从文件或字符串向量中读取配置,getoption 会自动完成解析、校验和类型转换。本文将带你从基础用法到高阶技巧,彻底掌握这个工具。 一、设计理念:声明式配置管理 传统的配置解析往往是"命令式"的:读一行、判断键名、手动转换类型、检查是否缺失。getoption 将其转变为"声明式": // 1. 声明:我的程序需要这些参数 getoption gopt; gopt.add_options({"range", "interval", "output"}, {true, true, false}); // 2. 读取:从配置文件加载 gopt.read_options("config.txt"); // 3. 校验:自动检查必填项和互斥组 gopt.check_mandatory(); // 4. 使用:直接获取已转换类型的值 auto range = gopt.get_value<std::string>("range"); auto weight = gopt.get_values<double>("weight", '|', '/'); 这种设计的优势: 集中管理:所有参数定义在一处,一目了然 自动校验:必填项、互斥组自动检查,无需手写 if 判断 类型安全:模板函数自动完成字符串到目标类型的转换 别名支持:一个参数可以有多个名称(如 model-file/ModelFile/model_file) 二、快速上手 2.1 配置文件格式 getoption 使用简洁的 key-value 格式: # 以 # 开头的行是注释,会被自动跳过 range = 100/1000/200/2000/full_range interval = 10/10 weight = 120.12/232/114.2 model-file = test.txt # 空行也会被跳过,不影响解析 # 同一个 key 可以出现多次,值会自动合并 model-tag = model1 model-tag = model2 model-tag = model3 out-model = example.msh 格式规则: ...

May 10, 2026 · 张壹

process_monitor: C++ 交互式进程监控,让科学计算可控可停

引言 科学计算程序往往需要运行数分钟甚至数小时。在这漫长的等待中,用户常常面临几个痛点: 程序是否在正常运行?进度如何? 发现参数设置有误,能否暂停调整而不是强制终止? 想查看当前中间结果,又不想打断计算流程? process_monitor 是 utilsxx 库中的交互式进程监控组件。它以非侵入式的设计理念,让你只需继承一个基类、重写几个虚函数,就能为任何计算任务赋予暂停/继续/状态查看/安全退出的交互能力。本文将带你彻底掌握它的设计与使用。 一、核心设计:为什么需要 process_monitor? 1.1 传统方案的局限 方案 问题 Ctrl+C 强制终止 丢失中间结果,无法优雅收尾 信号处理(SIGINT) 跨平台差异大,代码复杂 日志文件轮询 实时性差,无法交互控制 独立 GUI 监控 引入重量级依赖,不适合服务器环境 1.2 process_monitor 的设计哲学 非侵入式:你的计算逻辑几乎不用修改,只需在循环中插入一行 wait_for_keyboard() 跨平台:Windows(_kbhit/_getch)和 Unix(termios/select)统一封装 线程安全:键盘监控与计算逻辑分离,通过条件变量同步 可扩展:所有交互行为都是虚函数,可按需重写 1.3 状态机模型 RUNNING --[pause_key]--> PAUSED --[continue_key]--> RUNNING | | |--[quit_key] |--[quit_key] v v STOPPED <----------------- STOPPED 二、快速上手 2.1 最小示例 #include "process_monitor.h" class MyCalculator : public utilsxx::process_monitor { public: void process() override { while (!end_process()) { // 你的计算逻辑... do_calculation_step(); // 每秒钟检查一次键盘输入 wait_for_keyboard(1); } } }; int main() { MyCalculator calc; calc.start_monitoring(); return 0; } 运行后,你可以随时按下: ...

May 10, 2026 · 张壹

progress_bar: C++ 终端进度条,一文从入门到高阶

引言 命令行程序在处理耗时任务时,一个直观的进度条能极大提升用户体验。然而 C++ 标准库并未提供终端进度条组件,开发者要么引入重型第三方库,要么自己手写 ANSI 转义码控制光标。 progress_bar 是 utilsxx 库中的轻量级终端进度条组件,它零依赖、跨平台、开箱即用,同时提供了 indicators 第三方库的集成示例,满足不同场景需求。本文将带你一文看懂如何使用它,以及有哪些实用技巧。 一、快速上手:三行代码显示进度条 #include "progress_bar.hpp" int main() { utilsxx::progress_bar bar("Processing", 101); for (int i = 0; i < 101; ++i) { bar.tick(); // 每步调用一次 // 你的耗时操作... } return 0; } 终端输出效果: Processing |████████████████████████████████████████░░░░░░░░░░| 75.0% 二、核心设计 2.1 两种显示模式 模式 枚举值 说明 完整模式 Full 进度条 + 百分比数字(默认) 数字模式 NumberOnly 仅显示百分比数字,无图形条 2.2 颜色系统 支持已完成部分和未完成部分分别设置颜色: 颜色 枚举值 ANSI 效果 白色 White 默认粗体 绿色 Green 粗体绿色 红色 Red 粗体红色 蓝色 Blue 粗体蓝色 黄色 Yellow 粗体黄色 2.3 智能宽度适配 进度条长度自动根据终端宽度计算,无需手动调整: ...

May 10, 2026 · 张壹

toml11: C++ TOML 解析完全指南

引言 在程序配置领域,TOML(Tom’s Obvious, Minimal Language)凭借其直观的语法和强类型特性,逐渐成为 JSON 和 YAML 的有力替代者。与 JSON 相比,TOML 支持注释、更易于手写;与 YAML 相比,TOML 语法更严格、歧义更少。 toml11 是一个现代 C++17 的 TOML 解析库,以header-only、类型安全、异常友好著称。utilsxx 将其作为外部组件集成到 lib/toml.hpp 中,方便项目直接使用。本文将基于 toml11 的完整功能,结合 utilsxx 中的示例,带你彻底掌握 TOML 在 C++ 中的读写技巧。 一、TOML 速览 1.1 为什么选择 TOML? 特性 TOML JSON YAML 注释支持 ✅ ❌ ✅ 强类型 ✅ ✅ ❌(隐式转换多) 手写友好 ✅ ⚠️ ⚠️(缩进敏感) 日期时间 ✅ 原生 ❌ ✅ 表(Table) ✅ ❌(用对象模拟) ✅ 歧义性 低 低 高 1.2 TOML 核心语法 # 这是注释 # 键值对(基本类型) title = "TOML Example" enabled = true port = 8080 pi = 3.14159 # 表(类似 JSON 的对象) [owner] name = "Tom Preston-Werner" dob = 1979-05-27T07:32:00-08:00 # 嵌套表 [servers.alpha] ip = "10.0.0.1" role = "frontend" # 数组 ports = [8000, 8001, 8002] # 表数组(数组的每个元素是一个表) [[products]] name = "Hammer" sku = 738594937 [[products]] name = "Nail" sku = 284758393 二、快速上手 2.1 解析 TOML 文件 #include "toml.hpp" #include <iostream> int main() { // 解析文件 const auto root = toml::parse("config.toml"); // 获取值 std::string title = toml::find<std::string>(root, "title"); std::cout << "Title: " << title << std::endl; return 0; } 2.2 两种访问方式 toml11 提供两种访问风格: ...

May 10, 2026 · 张壹

UtilsXX: 专为科学计算打造的 C++17 工具库

引言 在科学计算和工程应用领域,C++ 开发者常常面临一个尴尬的局面:标准库提供了基础的数据结构和算法,但面对具体的科研需求——比如读取一个带注释的 CSV 文件、在终端显示一个进度条、解析复杂的配置文件、或者监控一个耗时数小时的计算进程——往往需要自行编写大量"胶水代码"。 UtilsXX 正是为解决这些痛点而生。它是一个基于 C++17 的轻量级工具库,专为地球科学、物理学和工程计算领域设计。不同于 Boost 这样的"全能型"库,UtilsXX 聚焦于科研工作者日常最高频的需求:数据处理、文件读写、终端交互、配置管理、时间计算和物理常数。本文将全面介绍 UtilsXX 的设计理念、核心模块和使用方法,帮助你快速上手并融入自己的项目。 一、设计理念:为什么创建 UtilsXX? 1.1 科研编程的特殊需求 科学计算程序与传统软件工程有显著不同: 数据驱动:大量时间花在读取、清洗、转换各种格式的数据上 长时运行:数值模拟可能持续数小时甚至数天,需要进度反馈和交互控制 参数密集:算法通常有数十个可调参数,需要灵活的配置管理 跨平台协作:代码需要在个人笔记本、工作站和超算集群上无缝运行 快速迭代:研究思路变化快,代码需要易于修改和扩展 1.2 UtilsXX 的设计原则 原则 实践 Header-Only 优先 大部分组件为单头文件,直接 #include 即可使用 零依赖或内嵌依赖 核心模块无外部依赖;第三方库(如 nlohmann/json、toml11)直接内嵌 类型安全 大量使用模板和 static_assert,编译期捕获类型错误 异常友好 统一的 error_handler 错误处理机制,提供清晰的错误信息 跨平台 Windows、Linux、macOS 统一封装,终端操作透明适配 科研导向 内置地球物理常数、WGS84 参数、角度弧度转换等地学常用工具 1.3 与现有生态的关系 UtilsXX 不是要取代谁,而是填补"标准库不够用、重型框架太重"之间的空白: vs 标准库:补充了 CSV/JSON/TOML 解析、进度条、终端控制等缺失功能 vs Boost:更轻量、更聚焦,学习成本更低 vs Python 生态:让你在 C++ 中也能拥有类似 pandas(dsv_table)、tqdm(progress_bar)、argparse(get_option/CLI11)的体验 二、项目概览与快速开始 2.1 目录结构 utilsxx/ ├── lib/ # 核心头文件库 │ ├── vector.hpp # 向量类型与算法 │ ├── matrix.hpp # 轻量级矩阵 │ ├── dsv_table.hpp # 表格数据处理 │ ├── str_utils.hpp # 字符串工具 │ ├── file_utils.hpp # 文件操作 │ ├── get_option.hpp # 配置参数解析 │ ├── progress_bar.hpp # 终端进度条 │ ├── process_monitor.h # 进程监控 │ ├── utc_time.hpp # UTC 时间处理 │ ├── constants.hpp # 数学与物理常数 │ ├── term_utils.hpp # 终端控制 │ ├── json.hpp # JSON 解析(nlohmann/json) │ ├── toml.hpp # TOML 解析(toml11) │ ├── CLI11.hpp # 命令行解析(CLI11) │ ├── indicators.hpp # 高级进度条(indicators) │ ├── error_handler.hpp # 错误处理 │ └── src/ # 少量需要编译的源文件 │ └── process_monitor.cpp ├── demo/ # 示例程序 ├── data/ # 示例数据文件 ├── extra/ # 第三方库示例 ├── CMakeLists.txt # CMake 构建配置 ├── manager.sh # 便捷管理脚本 └── UtilsXXConfig.cmake.in # CMake 包配置模板 2.2 编译安装 UtilsXX 使用 CMake 构建,支持作为子项目或直接安装到系统: ...

May 10, 2026 · 张壹

重磁知识题库

选择题 地磁场中占比最大的内源稳定场为____,它代表了地磁场空间分布的主要特征。 A 大陆磁场 B 中心偶极子场 C 轴向地心偶极子场 D 磁异常 磁赤道处,地下球体产生的△T异常在中心主剖面上的特征为____。 A 轴对称曲线 B 点对称曲线 C 反对称曲线 D 不对称曲线 一个通过重心绕水平轴自由转动的磁针,令其水平轴垂直于磁子午面,磁针在磁赤道位置的静止状态为____。 A 磁针S极向下 B 磁针N极向下 C 磁针水平 D 磁针方向任意 质子磁力仪测量的读数值和经过各项校正计算所得的磁异常分别是指____。 A |$\vec{T}$|和 △T B |$\vec{T_a}$|和 △T C △T 和|$\vec{T_a}$| D |$\vec{T_a}$|和△Z E T|和Za 磁法勘探野外工作至少需要____以上仪器同时观测。 A 1台 B 2台 C 3台 在地球表面上任意一点的重力等于该点____。 A 重力位的一阶导数 B 重力位的梯度 C 重力位 总强度磁异常ΔT是地磁场总强度矢量与正常地磁场矢量的____。 A 矢量和 B 矢量差 C 模量差 D 模量和 磁法勘探野外工作方法中,若仪器读数显示不正常(如正常磁场47500nT,显示10000nT左右),且noise大于10nT,则可能是下述哪种原因引起的____。 A 探头方向不对 B 探头接线处松动或断裂 C 电源电压不足 在地球表面上任意一点所受到的全部地球质量对它产生的引力方向是____。 ...

December 31, 2024 · 张壹