visidata - 终端电子表格
技能脚本入口
本技能附带两套等价包装脚本(Unix .sh + Windows PowerShell .ps1),提供友好子命令入口与安装自检,免去记忆原始参数。
macOS / Linux(bash):
bash scripts/visidata-skill.sh <subcommand> [args...]
# 查看完整用法与示例
bash scripts/visidata-skill.sh help
Windows(PowerShell):
.\scripts\visidata-skill.ps1 <subcommand> [args...]
# 若被执行策略拦截,用下面这种调用绕过:
powershell -ExecutionPolicy Bypass -File scripts\visidata-skill.ps1 <subcommand> [args...]
可用子命令: open、stdin、python、sheet-help
脚本选择规则: macOS / Linux 用 .sh;Windows 用 .ps1。两者子命令完全一致。
脚本仅作便捷封装,最终调用系统的
visidata二进制;运行前请确保已安装对应工具(安装方式见下文各节)。说明:SkillHub 不支持.cmd/.bat文件类型,故不附带 Windows cmd 版;无 PowerShell 的环境可用 Git Bash 运行.sh版。个别依赖 Unix 管道工具的子命令(如 gron 的sed/fzf)在 Windows 下建议用 Git Bash 运行.sh版。
这是什么
visidata (saulpw/visidata, 8.5k ⭐) 是一个交互式终端电子表格多功能工具。支持 CSV、TSV、Excel (.xlsx/.xls)、JSON、JSONL、SQLite、Parquet、HDF5 等格式。提供类 Excel 的交互界面:透视表、频数分布、列统计、快速绘图、列类型转换、行过滤、正则搜索、多表连接等。
- GitHub: https://github.com/saulpw/visidata
- 文档: https://visidata.org/docs/
- Python 编写,单命令
vd启动,键盘驱动,无鼠标依赖
何时使用我
当用户出现以下意图时加载此技能:
- "visidata"、"vd 命令"、"终端电子表格"、"终端看 CSV/Excel"
- "交互式数据探索"、"透视表"、"频数分布"、"列统计"
- "CSV/Excel 快速绘图"、"终端画图"、"数据可视化"
- "多文件对比/连接"、"Sheet 间跳转"
- "列类型转换"、"数据清洗预览"
- "正则搜索/过滤行"、"大文件分页浏览"
- "JSON/JSONL 展平查看"、"SQLite 表浏览"
- "不想装 Excel/Jupyter 只想快速看数据"
核心能力
1. 启动与基础导航
# 打开各种格式
vd data.csv
vd data.xlsx
vd data.json
vd data.jsonl
vd data.sqlite
vd data.parquet
# 打开多文件 (每个文件一个 sheet)
vd file1.csv file2.csv file3.xlsx
# 从 stdin 读取
cat data.csv | vd -
curl -s api.example.com/data.csv | vd -
# 启动时指定分隔符/编码
vd -d ';' data.csv # 分号分隔
vd -e utf-16 data.csv # 编码
2. 界面与导航 (键盘驱动)
┌─────────────────────────────────────────────┐
│ Sheet 名称 │ 行号 │ 列类型 │ 数据预览 │
├─────────────────────────────────────────────┤
│ 键盘操作: │
│ ↑↓←→ / j/k/h/l 移动光标 │
│ Ctrl+F / / 搜索 (正则支持) │
│ n / N 下一个/上一个匹配 │
│ g / G 跳转首行/末行 │
│ 数字 + g 跳转指定行 │
│ Space 选中/取消选中行 │
│ Ctrl+A 全选 │
│ q / Ctrl+C 退出 / 强制退出 │
└─────────────────────────────────────────────┘
3. 列操作 (核心功能)
列光标下操作:
^ (Shift+6) 切换列类型: int/float/str/date/bool/decimal
& 列统计摘要 (均值、标准差、唯一值数等)
| 频数分布 (值计数、条形图)
_ 列重命名
} / { 列右移/左移
- 隐藏列
= 显示所有隐藏列
# 显示列号
行光标下操作:
! 反选行
d 删除选中行
y 复制选中行到新 sheet
s 排序 (当前列)
S 反向排序
4. 透视表 (Pivot Table) - 杀手级功能
在行光标下:
^ (Shift+6) 将当前列设为行标签
& 将当前列设为值字段 (聚合)
| 将当前列设为列标签
组合示例:
1. 光标选 "region" 列,按 ^ 设为行标签
2. 光标选 "product" 列,按 | 设为列标签
3. 光标选 "sales" 列,按 & 设为值 (默认求和)
4. 自动生成透视表新 sheet!
聚合函数切换 (值字段光标下):
a - sum (求和)
m - mean (平均)
n - count (计数)
v - variance (方差)
d - stddev (标准差)
i - min (最小)
x - max (最大)
u - unique (唯一值数)
5. 频数分布与快速绘图
列光标下:
| 频数分布表 (值、计数、百分比、累积%)
在频数分布 sheet 中:
g 绘制条形图 (ASCII/Unicode)
G 绘制直方图 (数值列)
p 绘制饼图
数值列直接绘图:
g 直方图
G 箱线图
6. 多 Sheet 管理
: 命令模式
:open file.csv 打开新文件为新 sheet
:sheet 0 切换到 sheet 0
:sheet name 按名切换
:sheets 列出所有 sheet
:join other_sheet 连接当前 sheet 与另一个 sheet
:save output.csv 保存当前 sheet
:saveall 保存所有 sheet
:quit 退出
7. 行过滤与变换
| 过滤器模式 (类 SQL WHERE)
输入表达式如:age > 30 and status == "active"
支持: == != < > <= >= in not in and or not ( ) 正则 =~
z 撤销上一步操作
Z 重做
列光标下按 = 计算新列 (表达式)
如:total = price * qty
如:full_name = first + " " + last
8. 数据导出
:save file.csv 保存为 CSV
:save file.xlsx 保存为 Excel
:save file.json 保存为 JSON
:save file.jsonl 保存为 JSON Lines
:save file.sqlite 保存为 SQLite (建表)
:save file.parquet 保存为 Parquet
:save file.tsv 保存为 TSV
:save file.html 保存为 HTML 表格
选中行导出:
选中行 → y (复制到新 sheet) → :save selected.csv
9. 连接多表 (Join)
# 在 sheet A 中:
:join sheetB
# 交互式选择:
# - 左键 (当前 sheet)
# - 右键 (目标 sheet)
# - 连接键列
# - 连接类型: inner/left/right/outer
# 生成新 sheet
10. Python API (脚本化)
import visidata as vd
# 编程式加载
sheet = vd.open_source('data.csv')
# 操作列
sheet.columns['price'].type = vd.FloatType
sheet.columns['date'].type = vd.DateType('%Y-%m-%d')
# 透视表
pivot = sheet.pivot(
rows=['region'],
cols=['product'],
vals=['sales'],
aggfuncs={'sales': 'sum'}
)
# 导出
pivot.save('pivot.csv')
典型工作流示例
场景 1:销售数据快速分析 (5 分钟出报告)
# 1. 打开数据
vd sales_2024.csv
# 2. 看列统计 (光标在任意列按 &)
# 看到:总行数、唯一值、空值、均值、标准差、最小/最大
# 3. 按区域+产品透视销售额
# 选 region 列 -> ^ (行标签)
# 选 product 列 -> | (列标签)
# 选 amount 列 -> & (值,求和)
# 自动生成透视表!
# 4. 画直方图看分布
# 在透视表中选 amount 列 -> g (直方图)
# 5. 导出透视表给老板
# :save pivot_report.xlsx
场景 2:脏数据清洗预览
# 1. 打开脏数据
vd dirty_export.csv
# 2. 看每列类型和异常 (按 & 看统计)
# 发现:price 列有 "N/A"、"-" 字符串混在数字里
# 3. 过滤异常行
# | (过滤器) -> price =~ "^[0-9.]+$"
# 只保留纯数字价格行
# 4. 转换列类型
# 选 price 列 -> ^ -> 选 float
# 5. 保存清洗后数据
# :save clean_data.csv
场景 3:多源数据对比 (CSV + Excel + JSON)
# 1. 一次打开多文件
vd actuals.csv budget.xlsx forecast.json
# 2. 在各 sheet 间切换
# :sheets 列出所有
# :sheet 0/1/2 切换
# 3. 连接对比
# 在 actuals sheet: :join budget
# 选连接键 (如 department)
# 生成对比 sheet
# 4. 算差异列
# 在对比 sheet 选空列 -> = -> 表达式: actual - budget
场景 4:日志/时序数据探索
# 1. 打开 JSON Lines 日志
vd app.log.jsonl
# 2. 展平嵌套 JSON (自动处理)
# 复杂嵌套自动展开为多列
# 3. 按时间排序
# 选 timestamp 列 -> s (排序)
# 4. 筛选错误
# | (过滤器) -> level == "ERROR"
# 5. 按小时聚合
# 选 timestamp 列 -> ^ (行标签,自动按小时分组)
# 选 level 列 -> | (列标签)
# 选任意列 -> & (计数)
场景 5:SQLite 数据库浏览
# 1. 直接打开数据库
vd analytics.db
# 2. 列出所有表 (每个表一个 sheet)
# :sheets 看到: users, orders, products, events...
# 3. 进入 orders 表
# :sheet orders
# 4. 连接 users 表查询用户名
# :join users
# 连接键: user_id
# 5. 导出查询结果
# :save user_orders.csv
快捷键速查表
| 类别 | 按键 | 功能 |
|------|------|------|
| 导航 | ↑↓←→ / j k h l | 移动光标 |
| | g / G | 首行/末行 |
| | 数字+g | 跳转行号 |
| | / / Ctrl+F | 搜索 (正则) |
| 选中 | Space | 选中/取消行 |
| | Ctrl+A | 全选 |
| | ! | 反选 |
| 列操作 | ^ | 切换类型/设为行标签 |
| | & | 列统计/设为值字段 |
| | | | 频数分布/设为列标签/过滤器 |
| | _ | 重命名列 |
| | } / { | 列右移/左移 |
| | - / = | 隐藏/显示列 |
| 行操作 | s / S | 升序/降序排序 |
| | d | 删除选中行 |
| | y | 复制选中行到新 sheet |
| | z / Z | 撤销/重做 |
| Sheet | : | 命令模式 |
| | :sheet N | 切换 sheet |
| | :join | 连接表 |
| | :save | 保存 |
| | q | 退出 |
安装方式
# pip (推荐,最新版)
pip install visidata
# 或隔离环境
pipx install visidata
# macOS (Homebrew)
brew install visidata
# Linux (发行版包可能较旧)
apt install visidata # Debian/Ubuntu
dnf install visidata # Fedora
pacman -S visidata # Arch
# Docker
docker run --rm -it -v "${PWD}":/data saulpw/visidata data.csv
进阶配置
# 配置文件 ~/.visidatarc (Python 语法)
# 示例:
options.default_floating_type = 'decimal' # 金融数据用 Decimal
options.precision = 4 # 默认小数位
options.theme = 'dark' # 主题
# 自定义命令
def my_custom_command(vd, sheet):
sheet.add_column('checksum', lambda row: hash(str(row)))
vd.bindkey('c', 'my_custom_command')
故障排查
| 问题 | 解决方案 |
|------|----------|
| "command not found: vd" | pipx install visidata 或检查 PATH |
| 启动慢/内存爆 | 大文件先用 xsv sample 10000 big.csv | vd - 采样预览 |
| 编码乱码 | vd -e gbk file.csv 指定编码 |
| 列类型识别错 | 手动按 ^ 切换类型,或预处理 xsv cast |
| 透视表生成慢 | 先采样或筛选减少行数,再透视 |
| 绘图显示方块 | 终端需支持 Unicode,设置 LANG=en_US.UTF-8 |
| JSON 嵌套太深 | visidata 自动展平,深层用 dasel/jq 先提取 |
相关技能
- xsv - 非交互式极速 CSV 统计/切片/连接 (管道友好)
- miller - awk 风格命名索引数据处理 (脚本化转换)
- sqlite-utils - CSV 导入 SQLite 做复杂 SQL
- dasel - 统一选择器跨格式查询
- fx - JSON 交互式探索 (visidata 也能看 JSON)
- yq - 格式转换 (visidata 导出前可先转格式)
技能版本: 1.0.0 | 作者: asdw741111 | 适用平台: OpenCode, Claude Code, Cursor, Codex CLI, Windsurf, Gemini CLI
微信扫一扫