CSV规范-字段开头和结尾的双引号

时间:2018-06-27 20:18:03

标签: perl csv

问题(由于无法解决),根据规范,""hello world""应该是CSV文件中的有效字段值吗?

即应:

1,""hello world"",9.5

是有效的CSV记录吗?

(如果是这样,那么我正在使用的Perl CSV-XS解析器会被轻微破坏,但是如果没有,那么$line =~ s/\342\200\234/""/g;是一个非常糟糕的主意;))

奇怪的是,这段代码已经运行了好几年了,但是我们只击中了一个以左双引号开头并且不包含逗号的记录(以上内容来自CSV预解析器)。

2 个答案:

答案 0 :(得分:4)

CSV的规范格式定义为https://www.rfc-editor.org/rfc/rfc4180.txt。它说:

  
      
  1. 每个字段可能会或可能不会用双引号引起来(但是      某些程序(例如Microsoft Excel)不使用双引号      完全没有)。如果字段没有用双引号引起来,则      双引号可能不会出现在字段内。例如:

         

    “ aaa”,“ bbb”,“ ccc” CRLF
        zzz,yyy,xxx

  2.   
  3. 包含换行符(CRLF),双引号和逗号的字段      应该用双引号引起来。例如:

         

    “ aaa”,“ b CRLF
         bb“,” ccc“ CRLF
         zzz,yyy,xxx

  4.   
  5. 如果使用双引号将字段括起来,则使用双引号      出现在字段中的内容必须通过在前面加上来进行转义      另一个双引号。例如:

         

    “ aaa”,“ b”,“ bb”,“ ccc”

  6.   

最后一条规则意味着您的行应该是:

1,"""hello world""",9.5

但并非所有解析器/生成器都完全遵循此标准,因此出于互操作性的原因,您可能需要放宽某些规则。这完全取决于您对CSV格式写入和CSV格式解析部分的控制程度。

答案 1 :(得分:0)

这取决于您使用的转义字符。如果您的转义字符为'"'(双引号),则您的行应类似于

1,"""hello world""",9.5

如果您的转义字符为'\'(反斜杠),则您的行应类似于

1,"\"hello world\"",9.5

检查您的解析器/环境默认值,或使用所需的转义字符显式配置解析器,例如使用反斜杠来做:

my $csv = Text::CSV_XS->new ({ quote_char => '"', escape_char => "\\" });