使用Text :: CSV解析perl中的CSV文件的问题

时间:2016-08-10 01:45:29

标签: perl csv parsing

我正在尝试使用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);
}

然后循环遍历所有行。

1 个答案:

答案 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格式不是很长,而且您必须解决它。