跳到主要内容
Convertube

CSV 文件:没有类型、没有编码、也没有委员会的格式

CSV 到底是什么、为什么同一个文件在两个电子表格里打开不一样、以及引号规则究竟规定了什么。在浏览器里转换 CSV,文件不上传。

速览

类型
文档
扩展名
.csv
MIME 类型
text/csv

一个 .csv 文件就是一个文本文件。没有文件头、没有版本号、没有类型信息,也没有任何二进制内容——用记事本打开,它的每一个字节你都看得见。每一行是一条记录,字段之间用某个符号隔开。这就是这个格式的全部,所以什么东西都能写出一个,也所以没有哪两个程序对它的理解完全一致。

展开说明

它有二十五年没有规范。RFC 4180 在 2005 年才出现,而且明确标着「仅供参考」而不是标准——它描述的是大多数实现在做什么,而不是要求谁怎么做。它真正定下来的是引号规则:字段里如果含有分隔符、引号或换行,就用双引号包起来,而字段内部的引号要写两遍。正是这条规则决定了「Widget, large」是一个单元格还是两个,也正是这条规则会被简陋的解析器跳过。

分隔符也不一定是逗号。一个把小数写成 1,5 的地区,电子表格不可能再用逗号分隔字段,所以 Excel 在那里导出的是分号——同一台机器、同一个菜单,产出的文件邻国打不开。数据库导出则常常用制表符。任何一个把 CSV 读得好的工具都会从前几行去猜,本站也是这么做的。

还有一件事是没有编码声明,而数据真正丢失的地方就在这里。一份存着中文姓名的 CSV,一个程序存、另一个程序开,出来就是乱码,因为一个假定 UTF-8,另一个假定系统代码页。而且因为每个字段都是没有类型的文本,电子表格在导入时会重新猜:零件号前面的零消失了,长编号变成了科学计数法,任何看起来像日期的东西都变成了日期。文件本身没问题,读它的方式有问题。

把 CSV 转成其他格式

CSV常见问题

CSV 就只是个文本文件吗?

完全是。没有容器、没有压缩、没有任何二进制内容。任何文本编辑器都能打开它,你看到的就是它的全部。

我的 CSV 为什么用分号?

因为它是在「逗号当小数点」的地区导出的,逗号不能再兼任字段分隔符。它仍然是 CSV,而任何值得用的读取器都会去识别分隔符,而不是想当然。

为什么前面的零不见了?

因为 CSV 不存类型,是电子表格猜的。「007」看起来像数字,于是变成了 7。文件本身没有任何问题——是导入时做的决定。多数电子表格允许你在导入时把某一列指定为文本,这是唯一可靠的办法。

中文为什么是乱码?

因为文件不声明自己的编码,而打开它的程序猜的和写它的程序不一样。存成带字节序标记的 UTF-8 能让 Excel 正确读出来,代价是那个标记在另一些工具里会显示成多余的字符。

这里能把 CSV 转成 PDF 吗?

能。文件是按 CSV 规范解析的,不是按逗号切分,所以引号字段能保住;列宽按内容决定,表头加粗。产出的东西是用来读和打印的——PDF 里的任何内容都不能排序或求和。

那转成 Excel 呢?

不需要:所有电子表格软件都能直接打开 CSV,先转一道只会多出一个「类型被猜错」的环节。这里确实存在的是反方向的转换——PDF 转 Excel,它是从一个从未记录过表格的页面里把表格重建出来。