Text::CSV开启allow_loose_quotes仍无法解析含内部引号的CSV
解决Text::CSV解析含未转义内部引号的CSV问题
首先修正代码中的语法错误:use Text::CSV 语句末尾必须添加分号,否则会触发Perl语法错误。
然后调整CSV对象的初始化参数,移除escape_char的设置(或显式设为undef),同时开启binary模式,修改后的代码如下:
use Text::CSV; my $csv = Text::CSV->new({ quote_char => '"', allow_loose_quotes => 1, sep_char => ',', binary => 1, # 支持处理所有字符编码和特殊字符 });
原因说明
你之前设置了escape_char => '\\',这会让Text::CSV期望用反斜杠\来转义字段内的双引号,但你的CSV文本中是直接使用未转义的双引号(如"foo "bar" baz"),这种情况下即使开启allow_loose_quotes也无法正确识别字段边界——解析器会把字段内的第一个未转义双引号当成字段结束符,导致解析失败。
移除escape_char后,Text::CSV会默认使用双写双引号作为转义方式,同时allow_loose_quotes参数会允许字段内出现未双写的单个双引号,配合binary模式可以兼容更多特殊字符场景,从而正确解析整个字段内容。
另外,解析失败时可以调用$csv->error_diag()获取具体错误信息,方便排查问题:
else { my ($code, $msg, $pos) = $csv->error_diag(); warn "解析失败: $msg (错误码: $code, 位置: $pos) 行内容: $line\n"; }
内容的提问来源于stack exchange,提问作者Arpit Saraf
相关产品推荐
相关产品推荐

