我有一个基本上仍处于测试阶段的脚本。 我想使用文本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,我得到的只是很多错误,因为它将后续的新行视为同一行的一部分。
答案 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();