csvq 1.18.1 介绍与选型指南
csvq 是 mithrandie 开发的 Go 单二进制 SQL shell,直接对 CSV/TSV/JSON/LTSV/定长文本平面文件执行 SQL 查询与写入,本文实测 v1.18.1 的安装、查询能力并与 dsq/OctoSQL/trdsql/SQLite 做量化选型对比
csvq 1.18.1 介绍与选型指南
目标:回答"csvq 是什么、能干什么、值不值得选"——在 Ubuntu 22.04 服务器上实测 v1.18.1 的安装与查询能力,并用可核验的社区指标与能力矩阵与同类平面文件 SQL 工具对比,给出选型结论。以下所有命令与输出均已在 Ubuntu 22.04(x86_64)+ csvq v1.18.1 环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(jammy),内核 7.0.0-38-generic,架构 x86_64
- csvq 版本:v1.18.1(GitHub releases 最新稳定版,发布于 2023-03-26,查询日期 2026-11-03)
- 安装方式:官方 release 二进制包
csvq-v1.18.1-linux-amd64.tar.gz(4,191,584 字节),解压后install到/usr/local/bin/csvq - 验证回显:
$ csvq --version
csvq version 1.18.1
- 测试数据:
/root/csvdemo目录下的users.csv、scores.tsv、products.json、access.ltsv四个平面文件(内容见第五章快速开始)
二、软件概述
csvq 是 mithrandie/csvq 项目(作者 Yuki,GitHub 描述 "SQL-like query language for csv")提供的 SQL 查询语言与交互式 shell,其定位是:不导入任何数据库,直接对 CSV、TSV、JSON、JSONL、LTSV、定长文本(FIXED)等平面文件执行标准 SQL。
它以单个 Go 二进制分发(Linux 版约 11 MB),既是命令行查询工具(csvq "SELECT COUNT(*) AS total FROM \users.csv`"),又是一个带事务、游标、用户自定义函数、流程控制语句的完整 SQL 引擎交互壳。与"把 CSV 塞进 SQLite 再查"的路线不同,csvq 把文件本身当作表:文件名即表名,SQL 的 UPDATE/INSERT/CREATE TABLE AS` 会直接回写文件。
💡 技术拓展:平面文件 SQL 查询工具不止 csvq 一家,常见同类与定位对比见第七章;若只需要一次性聚合而无需 SQL 方言,
mlr(Miller)与q也是同场景候选,本文聚焦"类 SQL 引擎"路线。
三、核心架构
csvq 内部分为三层,全部在单进程内完成,无外部依赖服务:
- 解析/执行层:自研 SQL 引擎,支持 SELECT/INSERT/UPDATE/REPLACE/DELETE/CREATE TABLE/ALTER TABLE 等语句,另有游标(DECLARE CURSOR)、预处理语句(PREPARE/EXECUTE)、用户自定义函数(DECLARE FUNCTION)、IF/WHILE 流程控制与事务(COMMIT/ROLLBACK,由首条写语句隐式开启,
BEGIN不是合法语句——实测报 syntax error)。实测交互壳中UPDATE后提示符变为(Uncommitted:1),COMMIT才落盘(见《csvq 1.18.1 常用 CLI 命令与工具详解》的交互壳章节)。 - 文件格式层:按扩展名或
--import-format自动选择 CSV/TSV/JSON/JSONL/LTSV/FIXED 读取器,支持--encoding(AUTO/UTF8/SJIS/UTF16 等)与分隔符、定长切割位等参数。实测AUTO编码能正确读取 Shift-JIS 文件:
$ csvq "SELECT * FROM \`sjis.csv\`"
名前,太郎,東京
花子,二郎,大阪
- 输出层:结果集可按
--format输出为 CSV/TSV/FIXED/JSON/JSONL/LTSV/GFM/ORG/BOX/TEXT 十种形态,配合--out FILE即成为格式转换器(如 JSON→CSV、LTSV→TSV 实测可用)。
四、功能特性
实测确认的关键特性:
| 特性 | 实测结论 |
|---|---|
| 多格式直查 | CSV/TSV/JSON/JSONL/LTSV/FIXED 均可 SELECT * FROM 文件名 直查 |
| 文件即表可写 | UPDATE/INSERT/REPLACE INTO/CREATE TABLE AS SELECT 直接改写磁盘文件 |
| 事务控制 | 交互壳支持 COMMIT/ROLLBACK(首条写语句隐式开启事务,BEGIN 报语法错误),未提交时提示符显示 (Uncommitted:N) |
| 编程能力 | 游标、PREPARE/EXECUTE、DECLARE FUNCTION、IF/WHILE、VIEW 临时表 |
| 格式转换 | -f + -o 组合实测完成 JSON→CSV、LTSV→TSV 转换 |
| 定长文本 | -i FIXED -m '[10,18,25]' 按累积切割位解析定长文件 |
| 嵌套 JSON | -j 'users' 提取对象数组为行集;JSON_TABLE('{}', @var) 解析变量 JSON |
| 内置子命令 | calc(stdin 管道计算)、fields(查看文件字段)、syntax(打印语法)、check-update(检查更新) |
| 返回码 | 成功 0;文件不存在 16;语法错误 4;TRIGGER ERROR 64;参数冲突 2(实测) |
五、快速开始
以下五步在 Ubuntu 22.04 服务器上从零跑通,命令与输出均为实测。
5.1 下载并安装二进制
$ cd /root
$ curl -sLO https://github.com/mithrandie/csvq/releases/download/v1.18.1/csvq-v1.18.1-linux-amd64.tar.gz
$ ls -la csvq-v1.18.1-linux-amd64.tar.gz
-rw-r--r-- 1 root root 4191584 Nov 3 04:04 csvq-v1.18.1-linux-amd64.tar.gz
$ tar xzf csvq-v1.18.1-linux-amd64.tar.gz
$ install -m 755 csvq-v1.18.1-linux-amd64/csvq /usr/local/bin/csvq
$ csvq --version
csvq version 1.18.1
官方直连 GitHub 下载实测 2.3 秒完成,无需代理。
5.2 准备测试数据
$ mkdir -p /root/csvdemo && cd /root/csvdemo
$ cat > users.csv <<'EOF'
id,name,age,city,salary,joined
1,Louis,35,Tokyo,5200000,2019-04-01
2,Sean,28,Osaka,4100000,2020-10-15
3,Mildred,42,Nagoya,6300000,2017-06-30
4,Harold,31,Fukuoka,3800000,2021-03-22
5,Sophie,26,Sapporo,3500000,2022-11-05
EOF
5.3 一次性查询
$ csvq "SELECT id, name, city FROM \`users.csv\` WHERE age > 30 ORDER BY salary DESC LIMIT 3"
id,name,city
3,Mildred,Nagoya
1,Louis,Tokyo
4,Harold,Fukuoka
⚠️ 注意:表名带扩展名(含
.)时必须用反引号包裹,否则报[L:1 C:27] syntax error: unexpected token "."。这是新手最常见的第一只拦路虎。
5.4 聚合与跨文件 JOIN
$ csvq "SELECT u.city, COUNT(*) AS n, AVG(u.age) AS avg_age FROM \`users.csv\` u GROUP BY u.city ORDER BY n DESC"
city,n,avg_age
Tokyo,1,35
Osaka,1,28
Nagoya,1,42
Fukuoka,1,31
Sapporo,1,26
5.5 进入交互壳
交互壳启动即打印横幅,提示符为「当前目录路径 + >」,查询结果以框线表格(TEXT 格式)呈现,表名可省略扩展名(users 自动解析为 users.csv):
$ csvq
csvq interactive shell
Press Ctrl+D or execute "EXIT;" to terminate this shell.
/root/csvdemo > SELECT COUNT(*) AS total FROM users;
+-------+
| total |
+-------+
| 5 |
+-------+
/root/csvdemo > EXIT;
⚠️ 注意:交互壳要求 TTY,管道或重定向 stdin 会被拒绝(报
input from pipe or redirection cannot be used);每条语句必须单行完成,多行 SELECT 报unexpected termination。
六、适用场景与限制
适合:
- 运维/数据人员在服务器上临时分析导出的 CSV/TSV/JSON 报表、日志(LTSV)、定长文件,不想装数据库;
- 平面文件格式互转(
-f+-o); - 需要"文件即表"的原地修改(加列、改值)且接受直接改写源文件的模式;
- 在脚本中做带 SQL 语义的单值计算(
calc子命令接管道)。
限制(实测确认):
- 项目自 2023-03 后无新提交(最后提交 2023-03,shields.io last-commit,查询日期 2026-11-03),功能冻结,但仓库未归档、
check-update显示 "The current version 1.18.1 is up to date."; - 不支持读取 SQLite/MySQL 等真实数据库,仅平面文件;
- 交互壳不支持多行语句(换行续读实测未生效),非 TTY 环境只能用
-e式单条查询或-s脚本; - 无
--row-limit之类的行数限制参数(实测报flag provided but not defined: -row-limit),限流需写 SQLLIMIT; - 时区名依赖系统 tzdata,未安装时仅接受
Local/UTC(实测timezone "Asia/Tokyo" does not exist)。
七、同类选型对比
社区指标取自 shields.io 与 GitHub 仓库页,查询日期 2026-11-03;功能结论取自各项目仓库描述与本文实测。
| 工具 | 仓库 | Stars | Forks | 许可证 | 最新 release | 最后提交 | 定位(仓库描述) |
|---|---|---|---|---|---|---|---|
| csvq | mithrandie/csvq | 1.6k | 68 | MIT | v1.18.1 | 2023-03 | SQL-like query language for csv |
| textql | dinedal/textql | 9.1k | 294 | MIT | 无 releases | 2023-10 | Execute SQL against structured text like CSV or TSV |
| OctoSQL | cube2222/octosql | 5.3k | 215 | MPL-2.0 | v0.13.0 | 2024-05 | join, analyse and transform data from multiple databases and file formats using SQL |
| dsq | multiprocessio/dsq | 3.9k | 162 | Apache-2.0 | v0.23.0 | 2023-09 | running SQL queries against JSON, CSV, Excel, Parquet, and more |
| trdsql | noborus/trdsql | 2.2k | 84 | MIT | v1.2.3 | 上周(持续活跃) | execute SQL queries on CSV, LTSV, JSON, YAML and TBLN |
💡 技术拓展:这批工具技术路线分三类——自研 SQL 引擎直读写文件(csvq)、借用 SQLite 作执行器(textql 导入后查、trdsql 可选 sqlite3/postgres/mysql 后端)、插件化多数据源架构(OctoSQL、dsq)。路线差异决定能力边界:只有 csvq 实测支持对源文件的事务性回写。
关键差异解读与选型建议:
- 传统路线:sqlite3 CLI(
.importCSV 进内存/临时库再查)——不属上表仓库对比范围,但它是 csvq 最直接的"替代方案":sqlite3 预装率高、SQL 成熟;代价是要手工.import(分隔符/表头/类型推断都要调)、JSON/LTSV/定长文件需先转 CSV、改回源文件要.dump/导出再覆盖。csvq 的差异正是"免导入、文件即表、原生多格式、原地回写"。 - 要"改文件"选 csvq:textql/dsq/OctoSQL 均为只读查询;csvq 的 UPDATE/CREATE TABLE AS 直接落盘且带 COMMIT/ROLLBACK。
- 要"连数据库一起 JOIN"选 OctoSQL 或 trdsql:csvq 只认平面文件。
- 要"活跃维护"选 trdsql:2026-05 仍发版;csvq/textql/dsq 提交已停在 2023-2024。
- 要"格式覆盖广(Parquet/Excel)"选 dsq;csvq 覆盖 CSV/TSV/JSON/JSONL/LTSV/FIXED 六种文本类。
- 纯一次性聚合、不介意 SQLite 中间态:textql 生态成熟(9.1k stars)但无正式 release,csvq 单文件部署更轻。
- 注意:dsq、OctoSQL、trdsql 的原仓库路径(montanaflynn/dsq、cylinder-c/octosql、nexmind/trdsql)实测均已 404,现分别迁至 multiprocessio、cube2222、noborus 组织下(2026-11-03 核验)。
结论:在"服务器上对平面文件做即席 SQL 查询 + 少量回写 + 格式转换"这一细分场景,csvq 是功能最完整、部署最轻(单二进制、无后端依赖)的选择;若需求偏向多源 JOIN、列式格式或长期维护保障,则按上表转选 trdsql/OctoSQL/dsq。
八、参考链接
- 官方仓库:https://github.com/mithrandie/csvq
- 官方参考手册:https://mithrandie.github.io/csvq/reference/
- 发布页(v1.18.1):https://github.com/mithrandie/csvq/releases/tag/v1.18.1
- 官方配置样例:https://raw.githubusercontent.com/mithrandie/csvq/master/csvq_env.json
- 同类项目:https://github.com/dinedal/textql 、https://github.com/cube2222/octosql 、https://github.com/multiprocessio/dsq 、https://github.com/noborus/trdsql
- 本专栏后续篇:《Ubuntu 22.04 安装 csvq 1.18.1 指南》《csvq 1.18.1 配置参数详解》《csvq 1.18.1 常用 CLI 命令与工具详解》(发布后可点击站内链接跳转)