【问题标题】:Issues parsing a CSV file in perl using Text::CSV使用 Text::CSV 在 perl 中解析 CSV 文件的问题
【发布时间】:2016-12-16 05:20:26
【问题描述】:

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

然后循环遍历所有行。

【问题讨论】:

  • 在打开显示所有字符/显示空白的文本编辑器中仔细查看文件,大约在第 8 行或第 9 行。也许有一个额外的选项卡,或者缺少选项卡,或者未转义的选项卡。我还会尝试将 CSV 文件导入电子表格,以检查所有列是否正确设置。
  • 你能显示几个连续的行,其中一些可以,一些不可以吗? (好的是前八个,还是一些“随机”的?)在你检查了丢失的东西之后,根据Mathew Lock的评论。
  • 使用 Data::Dumper 并转储每一行以查看它处理的最后一行是什么

标签: perl csv parsing


【解决方案1】:

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

有一个未加引号的转义字符串(“”之前没有反斜杠)。

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 “EIQ - 不允许使用 QUO 字符”

像 "foo "bar" baz",qu 和 2023,",2008-04-05,"Foo, Bar",\n 这样的序列会导致这个错误。

将引号字符设置为空(在调用Text::CSV_XS-&gt;new() 时设置quote_char =&gt; '')似乎可以解决此问题并允许处理整个文件。但是,我会花时间检查这是否是 CSV 数据的明智选择。

TL;DR 总而言之,您的 CSV 格式不是最好的,您将不得不解决它。

【讨论】:

  • 很抱歉接受晚了,但感谢您的详细回复。我希望在 Text::CSV 中默认是使用静默失败选项显式失败。谢谢!
  • 谢谢。我一辈子都想不通为什么我的代码突然失败了。
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多