2. CSV格式定义 (Definition of the CSV Format)
虽然CSV格式存在各种规范和实现(例如[4]、[5]、[6]和[7]),但不存在正式的规范,这导致对CSV文件的解释存在广泛差异。本节记录了大多数实现似乎遵循的格式。
格式规则
规则1: 记录与换行
每条记录位于单独的一行上,由换行符(CRLF)分隔。例如:
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF
规则2: 最后一条记录
文件中的最后一条记录可以有也可以没有结束换行符。例如:
aaa,bbb,ccc CRLF
zzz,yyy,xxx
规则3: 可选的标题行
可能存在一个可选的标题行,作为文件的第一行出现,其格式与普通记录行相同。此标题将包含与文件中字段对应的名称,并应包含与文件其余部分中的记录相同数量的字段(标题行的存在或缺失应通过此MIME类型的可选"header"参数指示)。例如:
field_name,field_name,field_name CRLF
aaa,bbb,ccc CRLF
zzz,yyy,xxx CRLF
规则4: 字段与逗号
在标题和每条记录中,可能有一个或多个字段,用逗号分隔。整个文件中每行应包含相同数量的字段。空格被视为字段的一部分,不应被忽略。记录中的最后一个字段后面不得跟随逗号。例如:
aaa,bbb,ccc
规则5: 双引号的使用
每个字段可以用双引号括起来,也可以不用(但是,某些程序(如Microsoft Excel)根本不使用双引号)。如果字段没有用双引号括起来,则双引号不得出现在字段内部。例如:
"aaa","bbb","ccc" CRLF
zzz,yyy,xxx
规则6: 特殊字符的处理
包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。例如:
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
规则7: 双引号的转义
如果使用双引号来括起字段,则字段内部出现的双引号必须通过在其前面加上另一个双引号来转义。例如:
"aaa","b""bb","ccc"
ABNF语法定义
ABNF语法[2]如下所示:
file = [header CRLF] record *(CRLF record) [CRLF]
header = name *(COMMA name)
record = field *(COMMA field)
name = field
field = (escaped / non-escaped)
escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
non-escaped = *TEXTDATA
COMMA = %x2C
CR = %x0D ; 根据RFC 2234 [2]第6.1节
DQUOTE = %x22 ; 根据RFC 2234 [2]第6.1节
LF = %x0A ; 根据RFC 2234 [2]第6.1节
CRLF = CR LF ; 根据RFC 2234 [2]第6.1节
TEXTDATA = %x20-21 / %x23-2B / %x2D-7E
实现注意事项
- 字符集: 虽然CSV的常见用法是US-ASCII,但可以与"charset"参数结合使用IANA为"text"树定义的其他字符集
- 换行符: 实现者应注意,虽然本规范使用CRLF表示换行符,但某些实现可能使用其他值
- 容错性: 实现者在处理CSV文件时应遵循"在你所做的事情上保守,在你从他人接受的内容上宽容"(RFC 793 [8])的原则