教程 · CSV → Markdown
CSV 转成一张 Markdown 表格
CSV 内部不写自己的规则。用哪个字符分列、引号怎么算、第一行算不算表头,全都是约定,而流通着的约定有好几套。表格出来不对,几乎总是因为拿错了那套约定去读它。
这篇讲分隔符是怎么定的、引号起什么作用,以及怎么让数字靠右对齐。
是哪个字符在分列
真实文件里常见四种:逗号、分号、制表符、竖线。分号比一般人想的多得多 —— 凡是把一点五写成 1,50 的地方,逗号早就被占着,表格软件只好去拿分号。
识别是自动的,而识别结果不是逗号时输出会说它用了哪个字符。这一行值得读 —— 前几行里有点特殊东西的文件(比如表头上面还有一行标题)会被读错,而这就是你发现的方式。
猜错了就自己指定分隔符。逗号、分号、制表符、竖线都能选。
- 01把文件拖进来,或者把几行直接贴进框里。
- 02看输出上方那条提示里有没有一个不是逗号的分隔符。
- 03本该六列的表格出来只有一列,就自己把分隔符选上。
当格子里就有那个分隔符
用双引号包起来的字段里可以有分隔符,而里面连着两个引号表示一个真的引号字符。这是 RFC 4180,处理得很正经 —— 这正是不能直接按逗号切开的全部原因。
换行也能躲在引号里,而这一点跟输出格式撞上了:竖线表格的一行必须正好占一行。所以格子内部的换行改写成 <br>,两行的地址两行都留着,也不会把这一行劈成两半。
格子文字里的竖线转义成 \|。不转的话,备注列里一根竖线会把一个五列的行变成六列。
name,note
Bolt,"M6 | 40mm
steel"| name | note |
| --- | --- |
| Bolt | M6 \| 40mm<br>steel |对齐那一行
表头下面那行连字符里可以带冒号,它决定渲染的时候这一列怎么对齐。左、中、右 —— 数字列要的是最后一个。
有一件事要知道:这个设置对整张表生效,不是按列设的。这里没有分列控制,因为 CSV 本身不带「哪列是数字」这种信息,而从值里猜会在邮编、电话号码和版本号上猜错。
所以一张大部分是数字的表,设成右对齐,然后手工改那一列文字。混着的就留默认 —— 一行纯连字符,所有渲染器都当左对齐。
Item,Cost
Bolt,0.40| Item | Cost |
| ---: | ---: |
| Bolt | 0.40 |表头行,和没有表头的文件
默认第一行当表头。关掉之后每一行都是数据行 —— 但表头行本身不会消失,它会是空的。
看着奇怪,但不是 bug:Markdown 的竖线表格必须有一个表头行。没有表头的表格根本不会被解析成表格,所以空表头是唯一一种既能表达「没有表头」又能渲染出东西的写法。
之后自己把列名填上,或者就留着 —— 空表头行渲染出来是数据上方一条细的空条。
Bolt,12
Nut,12| | |
| --- | --- |
| Bolt | 12 |
| Nut | 12 |长短不齐的行,和坏文件
列数不一样的行会补齐到最宽那行,输出会告诉你它看到了哪几种列数。这条提示通常说明上游有东西坏了 —— 一个六列文件里出现三格的行,一般是某个没转义的引号把一个分隔符吞了。
空行会丢掉,包括整行只有分隔符的行 —— 文件末尾一堆「,,,」通常就是这个。
值永远不做类型转换。007 还是 007,1-2 不会变成日期。Excel 会这么对你,这个不会,因为改了值就是改了你的数据。
文件开头的字节序标记会剥掉,这样第一列的表头不会带着一个看不见的字符。
这里的「大」是多大
两个上限。25 MB 文本,还有十万格 —— 行乘列,所以一个六列文件能到大概一万六千行,一个一百列的文件在一千行左右就停。
格数是你更容易撞上的那个,而它是渲染的限制而不是解析的限制。预览要给每一格建 DOM 节点,几十万个会把标签页卡死。拒掉比卡死好。
真的比这更大就按行切开分别转 —— 每一份里都把表头行重复一遍。
把 CSV 拖进来或者粘几行进去,数字该靠右就换一下对齐,然后复制表格。解析在这个标签页里做,所以那份客户导出留在你自己的硬盘上。
CSV → MD