
yq 如何解析 CSV 与 TSV 文件并调整自动解析行为【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yqyq 是一个用 Go 编写的命令行 YAML、JSON、XML、CSV、TOML、HCL 和 properties 处理器。当你手里有一份表格式的 CSV 或 TSV 文件想把它变成可以像 YAML 对象数组一样查询、过滤、修改的结构时yq 提供了一条直接的转换路径-pcsv/-ptsv负责解析decode-ocsv/-otsv负责编码回表格式encode。解析时 yq 默认会把“长得像 YAML/JSON”的字段值自动解析成结构化数据如果这不是你想要的可以用--csv-auto-parsef/--tsv-auto-parsef关掉。本文覆盖这条完整路径解析、关闭自动解析、换分隔符、再编码回去并原地修改。准备条件已安装 yq。yq 是 Go 编写的无依赖二进制支持下载预编译二进制、Homebrew、snap、Docker/Podman、go install等多种方式具体命令见 README.md 的 Install 章节。有一份表格式数据文件。yq 会根据文件扩展名自动识别格式未知扩展名或管道输入时默认按 YAML 处理CSV/TSV 文件如果扩展名识别有误用-p/--input-format显式指定即可-p支持csv|c、tsv|t等取值。本仓库自带一个可直接使用的样例文件 examples/sample_objects.csv内容为name,numberOfCats,likesApples,height ,1,true,168.8 Samanthas Rabbit,2,false,-188.8下面的示例命令大多来自 pkg/yqlib/doc/usage/csv-tsv.md文中的输出均为文档示例用于说明命令应产生的结构供你对照验证。把 CSV 解析成对象数组解码decode规则固定第一行是表头行其下所有行是数据行表头被用作对象的 key整个文件变成一个对象数组。文档中的样例sample.csvname,numberOfCats,likesApples,height,facts Gary,1,true,168.8,cool: true Samanthas Rabbit,2,false,-188.8,tall: indeed执行yq -pcsv sample.csv文档示例输出- name: Gary numberOfCats: 1 likesApples: true height: 168.8 facts: cool: true - name: Samanthas Rabbit numberOfCats: 2 likesApples: false height: -188.8 facts: tall: indeed注意facts列的值cool: true被解析成了嵌套的 YAML 映射而不是字符串——这就是自动解析auto-parse的默认行为--csv-auto-parse默认为true见 README.md 的 Flags 列表。调整自动解析行为如果某个列里存的本来就是自由文本碰巧包含:或看起来像 YAML/JSON 片段默认行为会把它解析成嵌套结构破坏原始数据。此时加--csv-auto-parsef文档明确说明关闭后“Entries with YAML/JSON will be left as strings”。对同一份sample.csv执行yq -pcsv --csv-auto-parsef sample.csv文档示例输出- name: Gary numberOfCats: 1 likesApples: true height: 168.8 facts: cool: true - name: Samanthas Rabbit numberOfCats: 2 likesApples: false height: -188.8 facts: tall: indeed对比两次输出唯一差别是facts从嵌套映射变成了带引号的字符串cool: true其余字段不受影响。选择依据很简单值应被当作数据而非文本时用默认自动解析列内容是文本、只是碰巧形似 YAML/JSON 时用--csv-auto-parsef保持字符串。TSV 有独立的开关--tsv-auto-parse默认同样为true用法一致。解析 TSV 文件TSV 文件用-ptsv指定输入格式其余规则与 CSV 相同第一行为表头。文档中的sample.tsvname numberOfCats likesApples height Gary 1 true 168.8 Samanthas Rabbit 2 false -188.8执行yq -ptsv sample.tsv文档示例输出与 CSV 解析结果结构一致facts列不存在- name: Gary numberOfCats: 1 likesApples: true height: 168.8 - name: Samanthas Rabbit numberOfCats: 2 likesApples: false height: -188.8用 --csv-separator 调整分隔符除了换行结构本身分隔符也是可调整的--csv-separator用于指定 CSV 分隔字符默认是,见 README.md Flags 列表。如果你的 CSV 使用其他分隔字符例如;在-pcsv的基础上追加该参数即可例如yq -pcsv --csv-separator; sample.csv其中;需要按你文件的实际分隔符替换。可选编码回 CSV/TSV 与往返修改如果目标不只是“读出来看”还要修改后写回表格式yq 支持解析和编码在同一条命令中往返round trip。文档中的样例sample.csv无facts列name,numberOfCats,likesApples,height Gary,1,true,168.8 Samanthas Rabbit,2,false,-188.8执行yq -pcsv -ocsv (.[] | select(.name Gary) | .numberOfCats) 3 sample.csv文档示例输出name,numberOfCats,likesApples,height Gary,3,true,168.8 Samanthas Rabbit,2,false,-188.8即按 CSV 读入、按 jq 风格表达式修改、再按 CSV 输出一条链完成。反过来把 YAML 编码为 CSV/TSV 用-ocsv/-otsv例如yq -ocsv sample.yml yq -otsv sample.yml编码侧有明确的结构限制文档原话只支持同质的扁平对象数组无嵌套并假设第一个对象包含全部所需 key。后续对象缺少某个字段时该列输出为空值文档示例中第一个对象缺少likesApples所以表头没有这一列第二个对象缺少numberOfCats所以该行该位置为空白。想要自定义列和表头需要先手动构造表头行再把对象转成值数组文档给出的写法是yq -ocsv [[Name, Number of Cats]] [.[] | [.name, .numberOfCats ]] sample.yml文档示例输出Name,Number of Cats Gary,1 Samanthas Rabbit,2限制与验证方式解码假设第一行是表头行无法表达“无表头”的 CSV数据行会全部编码进一个以表头为 key 的对象数组。自动解析是逐条目的只有形似 YAML/JSON 的值才会被解析其余字段原样保留--csv-auto-parse/--tsv-auto-parse分别控制 CSV 和 TSV默认都为true。编码为 CSV/TSV 时不支持嵌套结构且以第一个对象的 key 作为表头依据。验证方式按 pkg/yqlib/doc/usage/csv-tsv.md 给出的样例输入执行对应命令将输出与文档中的示例输出逐字段对照注意示例输出是文档示例用于确认结构和行为是否符合预期。仓库中的 examples/sample_objects.csv 可以直接作为本地练习输入如yq -pcsv examples/sample_objects.csv。【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考