跳到主要内容

CSV 转 YAML:把表格导出变成配置和种子数据

讲清楚 CSV 转 YAML 的真正用法:表头做键、每行变一个对象、类型推断怎么开关、嵌套和引号怎么处理,以及为什么这件事值得全程在浏览器本地完成,不上传任何数据。

发布于 作者 李雷
#CSV #YAML #配置文件 #数据转换 #开发工具

CSV 转 YAML:把表格里的数据变成对象列表

我手头最常见的一类活,是把别人在表格里维护的数据,搬进代码仓库当配置或种子数据。产品给一份在线表格,运营给一份导出的 CSV,而我要的是一份能直接 commit 进去的 YAML。中间这一步,手动敲很容易出错:逗号切错列、邮编丢了前导零、数字被当成字符串。CSV 转 YAML 这件事看起来简单,真正做对却有几个坑要躲。

为什么是 YAML,而不是直接用 CSV

CSV 适合人看和表格软件读,但它没有类型,也没有层级。一份 name,age 的表格里,30 到底是数字还是字符串,CSV 自己不知道。配置加载器、seed 文件、fixtures 读取器想要的,是一份带类型的对象列表。YAML 正好提供这个:每行数据是一个映射,整份文件是一个对象数组,缩进表达层级,还能写注释。

所以把表格变成配置,YAML 几乎是默认选择:Kubernetes 清单、GitHub Actions、docker-compose、Ansible 变量,全是 YAML。让非工程同事在表格里维护数据,我在仓库里用 YAML 消费,中间用工具转一次就接上了。

表头做键,每行变一个对象

核心规则只有一条:表头那行成为键,下面每一行数据各变成列表里的一个对象。

举个具体的。这份 CSV:

name,age,active
Alice,30,true
Bob,25,false

转出来是:

- name: Alice
  age: 30
  active: true
- name: Bob
  age: 25
  active: false

第一行 name,age,active 不再是数据,它定义了每个对象的三个键。下面两行分别变成列表里的两个对象。age 是数字,active 是布尔,这就是带了类型的好处:seed 加载时不用在迁移里堆一长串字符串转整数的转换。

如果你的 CSV 根本没有表头,取消勾选「首行是表头」,工具会把每一行都当数据,按最宽那行生成 col_1col_2 这样的键。处理从没带列名的原始导出或日志时,这样最省事。

类型推断:这一步决定数据对不对

类型推断是 CSV 转 YAML 里最容易翻车的地方。打开它,"123" 变成数字 123,"true" 变成布尔,空单元格变成 null;关掉它,每个单元格都老老实实留作文本。

多数数据该开。但有一类值必须把推断关掉:看着像数字、却必须留作字符串的编码。邮编 "007" 开着推断会变成数字 7,前导零没了;手机号、SKU 编号、还有像 "1.10" 这种会被推断成 1.1 的版本号,都是同一类陷阱。我的习惯是,只要某列是"标识符"而不是"可以做算术的量",就把整列当文本处理。靠谱的工具在推断关掉时,会给有歧义的值自动加引号,保证生成的还是合法 YAML。

引号和带逗号的字段

第二个常见坑是字段里本身含逗号。如果单元格是 "北京, 朝阳",正确的解析器(按 RFC 4180 规范)会把双引号包住的部分当成一个完整的值,逗号不切列。但前提是导出时这个字段确实带了引号,表格软件导出一般都会加。

最容易踩的,是有人手写或脚本拼出来的 CSV,把 北京, 朝阳 写成没引号的样子。这时解析器会当成两列,后面每一列都右移一格,整张表错位。遇到这种,要么从源头重新导出并正确加引号,要么自己把这些字段用双引号包起来。

我自己怎么用这一步

我维护过一份多语言文案表格,译者在里面一列放 key、每种语言各一列。每次发版前,我把要的那一块导出成 CSV,转成 YAML,再拼进 i18n 语言文件。最早我用脚本拼,结果中文和带重音的字符偶尔被转义坏掉。换成全程 UTF-8、不动带引号字段内字节的转换之后,这个问题就没再出现过。整个过程在浏览器本地跑,译稿不上传到任何服务器,这一点对还没发布的文案很重要。

本地处理,别把数据交出去

最后一点也是我最在意的:这类转换没有任何理由要联网。解析、类型推断、YAML 序列化,全是浏览器标签页里的 JavaScript 在做,不需要把你的表格发给任何服务器。

唯一要留意的是分享链接。分享链接会把 CSV 编进网址,所以把"分享链接"贴进聊天,对方服务器的访问日志就会留下这份数据。涉及保密的表格,用复制或下载按钮发文件,别发网址,用完关掉标签页就什么都不留。

需要现成工具的话,直接用 CSV 转 YAML 工具:贴进 CSV、选分隔符、决定类型推断开关,输出旁边还会显示列数,一眼就能看出分隔符猜得对不对。如果你这次要的是 JSON 而不是 YAML,同样的输入交给 CSV 转 JSON 工具 就行,转一次,两种格式都留着。


Made by Toolora · Updated 2026-06-13