狭义的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,行结束符。
字段中的数据按照字符解释,不按字节解释。
同一记录相邻字段必须用分隔符隔开。
看例子:
[img]http://dl.iteye.com/upload/attachment/0072/6035/6a372b05-a5b6-38d2-a80d-0307ee30c2f8.jpg[/img]
说明:
第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
这个问题,动手设计用例比较重要。
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,行结束符。
字段中的数据按照字符解释,不按字节解释。
同一记录相邻字段必须用分隔符隔开。
看例子:
[img]http://dl.iteye.com/upload/attachment/0072/6035/6a372b05-a5b6-38d2-a80d-0307ee30c2f8.jpg[/img]
说明:
第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
这个问题,动手设计用例比较重要。