csvq 1.18.1 介绍与选型指南

csvq 是 mithrandie 开发的 Go 单二进制 SQL shell,直接对 CSV/TSV/JSON/LTSV/定长文本平面文件执行 SQL 查询与写入,本文实测 v1.18.1 的安装、查询能力并与 dsq/OctoSQL/trdsql/SQLite 做量化选型对比

csvqcsvqSQLCLI工具Go命令行2026/11/03

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 内部分为三层,全部在单进程内完成,无外部依赖服务:

  1. 解析/执行层:自研 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 命令与工具详解》的交互壳章节)。
  2. 文件格式层:按扩展名或 --import-format 自动选择 CSV/TSV/JSON/JSONL/LTSV/FIXED 读取器,支持 --encoding(AUTO/UTF8/SJIS/UTF16 等)与分隔符、定长切割位等参数。实测 AUTO 编码能正确读取 Shift-JIS 文件:
$ csvq "SELECT * FROM \`sjis.csv\`"
名前,太郎,東京
花子,二郎,大阪
  1. 输出层:结果集可按 --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),限流需写 SQL LIMIT;
  • 时区名依赖系统 tzdata,未安装时仅接受 Local/UTC(实测 timezone "Asia/Tokyo" does not exist)。

七、同类选型对比

社区指标取自 shields.io 与 GitHub 仓库页,查询日期 2026-11-03;功能结论取自各项目仓库描述与本文实测。

工具仓库StarsForks许可证最新 release最后提交定位(仓库描述)
csvqmithrandie/csvq1.6k68MITv1.18.12023-03SQL-like query language for csv
textqldinedal/textql9.1k294MIT无 releases2023-10Execute SQL against structured text like CSV or TSV
OctoSQLcube2222/octosql5.3k215MPL-2.0v0.13.02024-05join, analyse and transform data from multiple databases and file formats using SQL
dsqmultiprocessio/dsq3.9k162Apache-2.0v0.23.02023-09running SQL queries against JSON, CSV, Excel, Parquet, and more
trdsqlnoborus/trdsql2.2k84MITv1.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(.import CSV 进内存/临时库再查)——不属上表仓库对比范围,但它是 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。

八、参考链接