我正在尝试使用Text::CSV来解析此CSV file。我是这样做的:
open my $fh, '<', 'test.csv' or die "can't open csv";
my $csv = Text::CSV_XS->new ({ sep_char => "\t", binary => 1 , eol=> "\n"});
$csv->column_names($csv->getline($fh));
while(my $row = $csv->getline_hr($fh)) {
# use row
}
因为该文件有169,252行(不计算标题行),所以我希望循环可以多次运行。但是,它只运行8次,给我8行。我不确定发生了什么,因为CSV看起来像普通的CSV文件,其中\n
作为行分隔符,\t
作为字段分隔符。如果我像这样遍历文件:
while(my $line = <$fh>) {
my $fields = $csv->parse($line);
}
然后循环遍历所有行。
答案 0 :(得分:3)
Text :: CSV_XS无提示失败并显示错误。如果你在while循环之后放入以下内容:
my ($cde, $str, $pos) = $csv->error_diag ();
print "$cde, $str, $pos\n";
您可以查看解析文件时是否有错误并获得输出:
2034, EIF - Loose unescaped quote, 336
这意味着专栏:
GT New Coupe 5.0L CD Wheels: 18" x 8" Magnetic Painted/Machined 6 Speakers
有一个不带引号的转义字符串(&#34之前没有反斜杠)。
Text::CSV
perldoc声明:
allow_loose_quotes
默认情况下,解析在不带引号的字段中包含quote_char字符的字段,例如
1,foo "bar" baz,42
会导致解析错误。尽管允许使用这种格式仍然是不好的做法,但我们无法帮助一些供应商使他们的应用程序吐出这样的样式。
如果您将创建Text::CSV_XS
的参数更改为:
my $csv = Text::CSV_XS->new ({ sep_char => "\t", binary => 1,
eol=> "\n", allow_loose_quotes => 1 });
问题消失了,直到第105265行,当错误2023出现时:
2023, EIQ - QUO character not allowed, 406
perldoc中此错误的详细信息:
2023&#34; EIQ - 不允许使用QUO字符&#34;
&#34; foo&#34; bar&#34; baz&#34;,qu和2023,&#34;,2008-04-05,&#34; Foo,Bar&#34;,\ n将导致此错误。
将引号字符设置为空(在quote_char => ''
的调用中设置Text::CSV_XS->new()
)似乎可以解决此问题并允许处理整个文件。但是我需要时间来检查这是否是CSV数据的合理选项。
TL; DR 您的CSV格式不是很长,而且您必须解决它。