CSV 文件格式
描述
逗号分隔值(Comma-Separated Values,CSV,有时成为字符分隔值)。
其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。
每个记录由一个或多个字段组成,用逗号分隔。使用逗号作为字段分隔符是此文件格式的名称的来源,因为分隔字符也可以不是逗号,有时也称为字符分隔值。
CSV 广泛用于不同体系结构的应用程序之间交换数据表格信息,解决不兼容数据格式的互通问题。一般按照传输双方既定标准进行格式定义,而其本身并无明确格式标准。
特征
- 文件采用纯文本存储,需要使用某个字符集(ASCII、Unicode、UTF-8等)
- 数据由记录组成(一般是每一行一条记录)
- 每条记录被分隔符分为一个个字段(常用的分隔符有
','
,'\t'
,' '
,';'
等)- 每条记录都有同样的字段序列
优点
由于 CSV 文件格式的特性。
CSV 格式的文件可以用 Excel 和 WPS 等表格工具以表格的形式打开,便于查看和编辑。
缺点
由于 CSV 文件格式没有严格的标准(实际上可以认为没有标准),会造成使用不同的工具打开时会有不同程度的乱码问题。
(你本地的 Excel 和 WPS 打开同一个 CSV 文件,往往显示的情况会不一样。甚至同一个 Excel 软件的不同版本,也会显示不一样的结果)
所以进行一些约定很重要。
CSV 文件解析的关键点
字符集:由于文件是采用纯文本存储的,不同字符集对每个字符的存储方式不一样。需要统一采用一个字符集才能很好的进行兼容。(关于常用的 ASCII、Unicode、UTF-8 字符集可以看一下这个ASCII、Unicode、UTF-8)
分隔符:一般常用的是 ','
(逗号分隔符)。但是有些 CSV 文件需要存储文章句子信息等,这些信息 ','
符是常用字符,容易造成解析出错或者解析方法复杂。可以选用 '^'
/ '\t'
等不常用的字符作为分隔符。应用途而异,具体问题具体分析。
记录分隔:一般来说以一行为一条记录,那么记录与记录之间就是常用"换行符"进行分隔的?这里就需要看一下附录:回车符 CR 与换行符 LF 的行末结束符之争。
空字段:我们常使用 CSV 文件当做表格来处理,那么表格显然存储某些字段为空的情况。这种情况下需要注意保留两个分隔符,表示一段空字段。
Excel 和 WPS 建议格式
Warning:个人测试结果,有问题不要打我!!!(难免有版本问题)
Warning:个人测试结果,有问题不要打我!!!(难免有版本问题)
Warning:个人测试结果,有问题不要打我!!!(难免有版本问题)
由于经常使用的文字包含 英文 和 简体中文,需要考虑一个合适的字符集:
信息 | 建议设置 | |||
---|---|---|---|---|
字符集 | Unicode | |||
分隔符 |
',' (逗号分隔符) |
|||
记录分隔 | 这两个软件基本上是在 Windows 上使用的,那么需要采用 CRLF("\r\n" ) 作为行末分隔符 |
|||
其它 | 如果存储在字段里有 ',' 符号,需要用 '"' 包含字段。如:`姓名 |
年龄,性别 | 地址,CSV 的记录为: 姓名,"年龄,性别",,地址CRLF` |
基本上满足以上要求的,可以完美的用 Excel 和 WPS 打开查看和编辑和。
附录:回车符 CR 与换行符 LF 的行末结束符之争
在计算机出现之前,人们常用电传打字机(Teletype Model 33)打印字符,它每秒可以打印 10 个字符(0.1 秒 / 字符)。
但在打印完一行后,准备换行时发现换行需要用去 0.2 秒。
而这 0.2 秒正好可以打印两个字符。
如果这 0.2 秒内有新的字符传过来,那么传过来的字符将会丢失(因为它正在换行,无法进行打印作业)。
电传打字机的研发人员为了解决此问题,决定在每行后面添加两个表示接受的字符:CR、LF
CR(Carriage Return,回车符):告诉打字机把打印头重定位在该行的左边界
LF(Line Feed,换行符):告诉打字机把打印头下移一行,即把纸向下移一行
随着计算机的出现,这种处理机制被移到计算机上。
但是早期计算机容量很小(存储器很贵),有人认为每行结尾加 2 个字符太浪费了,应该加 1 个字符就行。
从此出现 行末结束符 之争:
换行符('\n',LF,Line Feed)
回车符('\r',CR,Carriage Return)
系统 | 行末结束符 | ASCII 表示 | 结束符字符数 |
---|---|---|---|
Windows,DOS | CRLF | "\r\n" | 2 |
Linux,UNIX | LF | "\n" | 1 |
Mac | CR | "\r" | 1 |
这种分歧导致:
Windows 打开 Linux 的文件,所有的文字都会变成一行(因为 Windows 认为 CRLF 才表示换行)
而 Linux 打开windows 文件,每一行结尾会多出一个 ^M
符号