使用Text :: CSV在Perl中跳过错误的CSV行

时间:2014-12-08 19:30:26

标签: perl csv

我有一个基本上仍处于测试阶段的脚本。 我想使用文本CSV来分解每小时转储的大量CSV文件。

这些文件可能非常大且质量不稳定。 有时我会得到奇怪的字符或数据,但通常的问题就是停止的行。

"Something", "3", "hello wor

封闭的报价是我最大的障碍。剧本刚刚破裂。错误发生在stderr,我的while循环被破坏了。

While (my $row = $csv->getline($data))

我得到的错误是......

# CSV_PP ERROR: 2025 - EIQ - Loose unescaped escape

我似乎无法对此进行任何类型的错误处理。如果我启用allow_loose_escapes,我得到的只是很多错误,因为它将后续的新行视为同一行的一部分。

1 个答案:

答案 0 :(得分:4)

允许松散逃生不是答案。它只是让你的程序忽略错误并尝试将断行与你的其他行合并,正如你还提到的那样。相反,您可以尝试解决问题,并检查$row是否定义:

use strict;
use warnings;
use Text::CSV;
use feature 'say';

my $csv = Text::CSV->new({
        binary  => 1,
        eol => $/,
    });

while (1) {
    my $row = $csv->getline(*DATA);
    $csv->eof and last; 
    if (defined $row) {
        $csv->print(*STDOUT, $row);
    } else {
        say "==" x 10;
        print "Bad line, skipping\n";
        say $csv->error_diag();
        say "==" x 10;
    }
}


__DATA__
1,2,3,4
a,b,c,d
"Something", "3", "hello wor
11,22,33,44

对我来说这是输出:

1,2,3,4
a,b,c,d
====================
Bad line, skipping
2034EIF - Loose unescaped quote143
====================
11,22,33,44

如果您想保存断行,可以使用$csv->error_input()访问它们,例如:

print $badlines $csv->error_input();