1 , eol=> "\-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:24:40 24 4
gpt4 key购买 nike

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

然后循环遍历所有行。

最佳答案

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

By default, parsing fields that have quote_char characters inside an unquoted field, like

1,foo "bar" baz,42

would result in a parse error. Though it is still bad practice to allow this format, we cannot help there are some vendors that make their applications spit out lines styled like this.

如果您将创建 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 character not allowed"

Sequences like "foo "bar" baz",qu and 2023,",2008-04-05,"Foo, Bar",\n will cause this error.

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

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

关于perl - 使用 Text::CSV 在 perl 中解析 CSV 文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com