问题(由于无法解决),根据规范,""hello world""
应该是CSV文件中的有效字段值吗?
即应:
1,""hello world"",9.5
是有效的CSV记录吗?
(如果是这样,那么我正在使用的Perl CSV-XS解析器会被轻微破坏,但是如果没有,那么$line =~ s/\342\200\234/""/g;
是一个非常糟糕的主意;))
奇怪的是,这段代码已经运行了好几年了,但是我们只击中了一个以左双引号开头并且不包含逗号的记录(以上内容来自CSV预解析器)。
答案 0 :(得分:4)
CSV的规范格式定义为https://www.rfc-editor.org/rfc/rfc4180.txt。它说:
每个字段可能会或可能不会用双引号引起来(但是 某些程序(例如Microsoft Excel)不使用双引号 完全没有)。如果字段没有用双引号引起来,则 双引号可能不会出现在字段内。例如:
“ aaa”,“ bbb”,“ ccc” CRLF
zzz,yyy,xxx包含换行符(CRLF),双引号和逗号的字段 应该用双引号引起来。例如:
“ aaa”,“ b CRLF
bb“,” ccc“ CRLF
zzz,yyy,xxx
如果使用双引号将字段括起来,则使用双引号 出现在字段中的内容必须通过在前面加上来进行转义 另一个双引号。例如:
“ aaa”,“ b”,“ bb”,“ ccc”
最后一条规则意味着您的行应该是:
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 => "\\" });