CSV文件的一些注意点

狭义的csv是comma separated values.
wiki的定义
CSV is a delimited data format that has fields/columns separated by the comma character and records/rows terminated by newlines.

广义的csv是以任意一个字符分隔的平面文件。

没有严格的标准,RFC 4180试图规范化CSV。

每条记录结束于行终止符。
每个字段用分隔符分隔(一般是逗号)。

常见的一些约束:

DOS-style lines that end with (CRLF) characters
每一个记录包含相同数目的字段,并且字段顺序相同。
任何字段可以用双引号引住。
字段中如果包含(行结束符)\r\n,双引号,逗号,该字段必须用双引号包住。
字段中的双引号用连续2个双引号表示。同时,该字段必须用双引号包住。
CSV文件不需要特定的字符集,编码,byte order,行结束符。
字段中的数据按照字符解释,不按字节解释。
同一记录相邻字段必须用分隔符隔开。

看例子:





说明:
第1行
左边:比较简单,不解释。
右边:字段可以用双引号包住。

第2行
左边:b","b被解释为2个字段,前一个字段为b",后一个字段以双引号开始,所以会跨行寻找该字段的值,直到配对的双引号或文件结束。
右边:"b","b"被解释为2个被双引号包住的字段。

第3行
左边:"b"",""b"被解释为一个字段被双引号包住,中间的连续双引号被转义为双引号。
右边:"b,b"被解释为一个字段被双引号包住,中间的分隔符,原样输出。

第4行
左边:b","b被解释为2个字段,前一个字段为b",后一个字段以双引号开始,所以会跨行寻找该字段的值,直到配对的双引号或文件结束。
右边:b"","b被解释为2个字段,前一个字段为b"",因为该字段没有以双引号开始,因此,连续的双引号没有转义。

第5行
左边:b""b被解释为一个字段。
右边:验证双引号开始的字段的跨行查找。

第6行
左边:"""的情况,字段以双引号开始,接下来的2个双引号转义,接下来查找该字段的其他值。
右边:单引号没有特殊功能,空和""含义相同。

第7行
左边:验证单引号没有特殊功能。

再补充一个
"aaaa"aa"aa被解释为6个a+"+aa,字段以"开头会寻找第一个匹配的",但是不代表字段结束。

更复杂的例子。
a,"aa"a
b,bb

这个问题,动手设计用例比较重要。

猜你喜欢

转载自zhang-xzhi-xjtu.iteye.com/blog/1638499