驯服表格混乱:终端直接搞定
如果你经常收到数据导出文件,你大概知道那种痛苦。一个 300MB 的文件,Windows-1251 编码,分隔符在某些地方是分号,在另一些地方是逗号,而且行内还有未转义的换行符。在 Excel 中打开这个文件,十有八九会让你的办公套件彻底卡死,或者不小心把电话号码的前导零给弄丢。为了做个简单的数据检查就临时写个 pandas 脚本也很麻烦。
在这种情况下,csvkit 就是救星——一套用于处理表格数据的命令行工具集。该项目自 2011 年起托管在 GitHub 上,已获得超过 6400 颗星,至今仍然是直接在 bash 中解析 CSV 文件最便捷的方式之一。
这个工具集能做什么
该包的创建者——新闻机构 Wire Services——的灵感来自 pdftk 和 GDAL 等工具。理念很简单:为开发者和数据分析师提供一套专门的 UNIX 管道命令,用于清理、切片、格式化和探索表格文件,无需编写代码。
这些工具按任务类型划分:转换、切片、分析和 SQL 查询执行。
快速预览和基本统计
csvlook 命令可以将原始 CSV 转换为格式整齐的 ASCII 表格,列对齐准确。配合 head 或 less 使用,可以获得极佳的预览效果:
head -n 20 data.csv | csvlook
如果你需要了解未知文件的结构,可以运行 csvstat。该工具会分析每列的数据类型,找出缺失值,计算最小值、最大值、平均值,并显示最频繁出现的值列表:
csvstat data.csv
切片和过滤
传统的 UNIX 工具如 cut 和 grep 在处理复杂 CSV 时经常出问题,尤其是当引号字段内出现逗号或换行符时。该包提供了专门的替代方案:
csvcut 可以按名称或编号提取所需的列:
csvcut -c "user_id,email,status" users.csv > clean_users.csv
csvgrep 可以按值或正则表达式过滤行:
csvgrep -c "status" -m "active" users.csv
直接在文件上执行 SQL
最便捷的命令之一是 csvsql。它可以做两件事。首先,它可以根据文件中的数据类型分析生成 PostgreSQL、MySQL 或 SQLite 的 DDL 模式。其次,它让你可以通过内置的 SQLite 直接对磁盘上的 CSV 文件编写 SQL 查询:
csvsql --query "select status, count(*) from users group by status" users.csv
你还可以像对待常规数据库表一样连接两个不同的文件:
csvsql --query "select u.name, o.total from users u join orders o on u.id = o.user_id" users.csv orders.csv
格式转换
in2csv 工具可以将几乎任何格式转换为 CSV:Excel 文件(.xls 和 .xlsx)、JSON、NDJSON 和定宽格式。无需启动 Excel 就能重新保存收到的报告:
in2csv report.xlsx --sheet "Sales" > sales.csv
底层原理
该包使用 Python 编写,通过 PyPI 分发。它使用 SQLAlchemy 进行数据库操作,这也解释了 csvsql 在处理不同 SQL 方言时的灵活性。
该架构的主要优势是与标准输入输出(stdin/stdout)的兼容性。命令可以通过常规管道轻松串联:
in2csv data.xlsx | csvgrep -c "country" -m "RU" | csvcut -c 1,3,5 | csvlook
不过这种方案也有缺点。由于该库使用纯 Python 编写且包含运行时类型检查,在处理数 GB 级别的文件时性能会下降。对于 TB 级别的导出文件,你最好使用 Rust 编写的 xsv 或 duckdb,但对于日常处理几百 MB 以内的任务,csvkit 的速度绰绰有余。
实际应用场景
- 在无 GUI 的远程服务器上检查数据结构。
- 在加载到 ETL 管道之前,用 bash 脚本对文件进行预清理。
- 为新的导出文件生成数据库表模式(
csvsql -i postgresql data.csv)。 - 通过
csvjoin按公共键快速合并两个不同的文件。
值得安装吗
该包只需一条 pip 命令即可安装:
pip install csvkit
如果你经常解析日志、处理数据库导入,或者收到包含 Excel 和 CSV 的压缩报告,这个工具集可以帮你省去很多麻烦。它让你无需打开笨重的编辑器,也无需为简单的两列过滤写临时脚本。从 csvlook 和 in2csv 开始吧——它们在使用的头五分钟内就能值回安装成本。
相关项目