教程 · CSV → Markdown

CSV 转成一张 Markdown 表格

CSV 内部不写自己的规则。用哪个字符分列、引号怎么算、第一行算不算表头,全都是约定,而流通着的约定有好几套。表格出来不对,几乎总是因为拿错了那套约定去读它。

这篇讲分隔符是怎么定的、引号起什么作用,以及怎么让数字靠右对齐。

去转换器

是哪个字符在分列

真实文件里常见四种:逗号、分号、制表符、竖线。分号比一般人想的多得多 —— 凡是把一点五写成 1,50 的地方,逗号早就被占着,表格软件只好去拿分号。

识别是自动的,而识别结果不是逗号时输出会说它用了哪个字符。这一行值得读 —— 前几行里有点特殊东西的文件(比如表头上面还有一行标题)会被读错,而这就是你发现的方式。

猜错了就自己指定分隔符。逗号、分号、制表符、竖线都能选。

  1. 01把文件拖进来,或者把几行直接贴进框里。
  2. 02看输出上方那条提示里有没有一个不是逗号的分隔符。
  3. 03本该六列的表格出来只有一列,就自己把分隔符选上。

当格子里就有那个分隔符

用双引号包起来的字段里可以有分隔符,而里面连着两个引号表示一个真的引号字符。这是 RFC 4180,处理得很正经 —— 这正是不能直接按逗号切开的全部原因。

换行也能躲在引号里,而这一点跟输出格式撞上了:竖线表格的一行必须正好占一行。所以格子内部的换行改写成 <br>,两行的地址两行都留着,也不会把这一行劈成两半。

格子文字里的竖线转义成 \|。不转的话,备注列里一根竖线会把一个五列的行变成六列。

CSV
name,note
Bolt,"M6 | 40mm
steel"
Markdown
| name | note |
| --- | --- |
| Bolt | M6 \| 40mm<br>steel |

对齐那一行

表头下面那行连字符里可以带冒号,它决定渲染的时候这一列怎么对齐。左、中、右 —— 数字列要的是最后一个。

有一件事要知道:这个设置对整张表生效,不是按列设的。这里没有分列控制,因为 CSV 本身不带「哪列是数字」这种信息,而从值里猜会在邮编、电话号码和版本号上猜错。

所以一张大部分是数字的表,设成右对齐,然后手工改那一列文字。混着的就留默认 —— 一行纯连字符,所有渲染器都当左对齐。

对齐:右
Item,Cost
Bolt,0.40
Markdown
| Item | Cost |
| ---: | ---: |
| Bolt | 0.40 |

表头行,和没有表头的文件

默认第一行当表头。关掉之后每一行都是数据行 —— 但表头行本身不会消失,它会是空的。

看着奇怪,但不是 bug:Markdown 的竖线表格必须有一个表头行。没有表头的表格根本不会被解析成表格,所以空表头是唯一一种既能表达「没有表头」又能渲染出东西的写法。

之后自己把列名填上,或者就留着 —— 空表头行渲染出来是数据上方一条细的空条。

表头行:无
Bolt,12
Nut,12
Markdown
|  |  |
| --- | --- |
| Bolt | 12 |
| Nut | 12 |

长短不齐的行,和坏文件

列数不一样的行会补齐到最宽那行,输出会告诉你它看到了哪几种列数。这条提示通常说明上游有东西坏了 —— 一个六列文件里出现三格的行,一般是某个没转义的引号把一个分隔符吞了。

空行会丢掉,包括整行只有分隔符的行 —— 文件末尾一堆「,,,」通常就是这个。

值永远不做类型转换。007 还是 007,1-2 不会变成日期。Excel 会这么对你,这个不会,因为改了值就是改了你的数据。

文件开头的字节序标记会剥掉,这样第一列的表头不会带着一个看不见的字符。

这里的「大」是多大

两个上限。25 MB 文本,还有十万格 —— 行乘列,所以一个六列文件能到大概一万六千行,一个一百列的文件在一千行左右就停。

格数是你更容易撞上的那个,而它是渲染的限制而不是解析的限制。预览要给每一格建 DOM 节点,几十万个会把标签页卡死。拒掉比卡死好。

真的比这更大就按行切开分别转 —— 每一份里都把表头行重复一遍。

把 CSV 拖进来或者粘几行进去,数字该靠右就换一下对齐,然后复制表格。解析在这个标签页里做,所以那份客户导出留在你自己的硬盘上。

CSV → MD