【免费下载链接】tennis
stylish CSV tables in your terminal
在终端里查看 CSV 数据,你是否也曾被密密麻麻、又宽又丑的原始文本劝退?tennis是一款用 Rust 编写的轻量级命令行工具,能把 CSV、JSON、SQLite 数据直接渲染成彩色、自动布局的终端表格:列宽自动适配窗口、主题色自动匹配深浅背景、数字自动格式化,一条命令让数据瞬间体面起来 🎾
为什么要用 tennis
普通cat file.csv的输出没有表头着色、没有对齐、列宽失控,超过终端宽度就直接"炸屏"。tennis 解决的就是这个问题:
- 自动布局:列宽自适应终端窗口,内容过长自动截断,绝不溢出
- 自动主题:检测终端背景色,自动切换浅色/深色配色
- 自动格式化:数字列千分位分隔、右对齐,百分比、浮点数都有专属样式
- 格式嗅探:CSV/TSV/分号/竖线分隔符自动识别,还能直接读 JSON 和 SQLite
一键安装:从 Homebrew 到源码构建
🍺macOS / Linux(Brew)
brew install gurgeous/tap/tennis📦Linux 直接下二进制:到 Releases 页面下载对应平台的 tarball,把tennis放进PATH(比如~/.local/bin)即可。
🔨源码构建(需要 Rust 工具链):
git clone https://gitcode.com/gh_mirrors/tennis/tennis cd tennis cargo build --release构建完得到的可执行文件在target/release/tennis。
初次运行:把 CSV 变成漂亮的表格
安装完成后,最简单的一条命令就是一次完整的体验:
tennis diamonds.csv -n --title "Diamond Inventory"-n开启行号,--title给表格加个标题,看效果:
表头每列一个颜色,数字列自动右对齐并格式化,整张表格恰好填满终端宽度——这就是 tennis 的默认风格,无需任何配置。
自动布局与智能配色:不设置也好看
tennis 会读取终端宽度(读不到时按 80 列处理),然后为每列分配"公平"的空间:窄列保留完整宽度,宽列分享剩余预算,实在放不下就优雅截断。拖动窗口时表格会实时重新排版,动画如下(仓库内置的 Titanic 数据集演示):
配色方面,tennis 会根据终端背景自动挑选亮色或暗色主题,也尊重NO_COLOR=1环境变量;想手动控制可以用--color on|off|auto和--theme dark|light。布局算法的完整思路写在 src/middleware/layout.rs 的头部注释里,用 "natural / budget / narrow / wide" 四个词就讲清楚了。
一键美化:标题、行号、斑马纹与边框样式
想让表格更"bling"?几个开关就够了:
cat test.csv | tennis --border psql --row-numbers --title BLING --zebra --head 10-z / --zebra:斑马纹,深浅交替更护眼--border rounded|thin|double|psql|...:边框样式与 nushell 对齐--scale <列名>:像 Google Sheets 一样给数值列加红→绿色阶,--rscale则反向-t / --title:表格大标题
样式细节的实现在 src/render/theme.rs,包括斑马纹与背景色的混合比例。
不止 CSV:自动识别 JSON、JSONL 与 SQLite
tennis 的输入层非常"随性":
- 按文件扩展名判断 CSV / JSON / SQLite,文件名不靠谱时就采样前几个字节(SQLite 魔数、
{/[开头)自动兜底,逻辑见 src/input/detect.rs - 分隔符不确定?逗号、Tab、分号、竖线都会尝试一遍,选"列数最多且不参差"的那个,见 src/input/sniffer.rs
- JSON 支持完整对象数组、JSONL/NDJSON,甚至单个对象(键值对变成行)
- SQLite 文件通过外部
sqlite3CLI 读取,--table可指定表名
所以cat data.csv | tennis、tennis spinel.jsonl、tennis sqlite-multi.db --table users都能直接跑,仓库测试数据里就有 tests/spinel.jsonl 这样的真实 JSONL 样例。
--peek 数据速览:先看形状,再下深水区
面对一个陌生数据文件,不必逐行翻。--peek会给你形状、抽样和每列统计:
tennis --peek unicode.csv顶部是8 rows × 3 cols的形状提示加 5 行抽样,底部 stats 表列出每列的类型、填充率(fill)、去重数(uniq)与最小/最大值。Unicode 和 emoji 内容也能正确对齐(内置了东亚宽字符与 emoji 宽度启发式)。实现见 src/peek.rs。
排序、筛选、选列:数据随手整理
tennis 也内置了一批"查数据"常用操作,不用切到别的工具:
| 需求 | 参数 |
|---|---|
| 选/重排列 | --select/--deselect |
| 排序(数字按值、文本按自然序) | --sort+-r反转 |
| 只看前/后几行 | --head 10/--tail 10 |
| 文本过滤 | --filter "关键字" |
| 随机打乱 | --shuffle |
| 放大某几列 | -b(大)、-bb(更大)、-bbb(最大) |
| 强制指定宽度 | --width 120/--width max |
| 分页浏览 | -p / --pager(走$PAGER或 less) |
排序时数字列按数值比较、文本列走自然排序(2 < 10 < 100),区分逻辑在 src/sort.rs。列太挤时用-bb 列名 -p放大关键列并翻页,是看宽表的最佳组合。
想深入?这些路径值得看看
- 项目文档与全部参数说明:README.md
- 自动布局算法:src/middleware/layout.rs
- 格式嗅探:src/input/sniffer.rs、src/input/detect.rs
- peek 统计实现:src/peek.rs
- 手册页与补全脚本:extra/tennis.1、extra/tennis.bash、src/templates/completion.zsh
- 测试数据(含中文宽字符、管道符、数字格式等边界场景):tests/titanic.csv、tests/cjk.csv
- 端到端冒烟测试:tests/smoke.bats
下次再打开一个 CSV,试试tennis 你的文件.csv -z -n,你的终端数据观感会立刻不一样 ✨
【免费下载链接】tennis
stylish CSV tables in your terminal
相关推荐
分割回文串 IV(LeetCode 1745)进阶题解:复用 1278 的"最少修改次数"统一判定 k 段回文分割
分割回文串 IV(LeetCode 1745)进阶题解:复用 1278 的"最少修改次数"统一判定 k 段回文分割 导读 本文讲解 LeetCode 第 226
tennis终端表格配色完全指南:自动主题与红绿色标度,让CSV秒变惊艳
tennis终端表格配色完全指南:自动主题与红绿色标度,让CSV秒变惊艳 tennis 是一款用 Rust 编写的命令行工具,能在终端里把 CSV 表格打印得漂
今日热门项目推荐:terminalcolor - 终端着色从未如此简单
今日热门项目推荐:terminalcolor 终端着色从未如此简单 项目价值 terminalcolor是一款轻量级终端文本着色工具库,其核心价值在于 用极简语
CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考