使用Parse :: CSV来限制拆分

时间:2015-05-12 17:33:25

标签: perl parsing csv

我正在尝试使用Parse::CSV来解析带有标题和2列的简单CSV文件。第二列可能包含逗号,但我想忽略它们。无论如何要限制它在逗号上分裂的次数?这是我到目前为止所拥有的

#!/usr/bin/perl
use Parse::CSV;

my $csv = Parse::CSV->new(file => 'file.csv');

while (my $row = $csv->fetch) {
    print $row->[0] . "\t" . $row->[1] . "\n";
}

以下是我的数据的示例:

  

1234,文本1,文本2

     

5678,文字3

     

90,文本4,text5

这将返回

1234    text1,text2
5678    text3
90      text4,text5

1 个答案:

答案 0 :(得分:1)

如果您真的与Parse::CSV结婚,可以使用filter执行此操作:

use strict;
use warnings;
use 5.010;

use Parse::CSV;

my $parser = Parse::CSV->new(
    file   => 'input.csv',
    filter => sub { return [ shift @$_, join(',', @$_) ] }
);

while ( my $row = $parser->fetch ) {
    say join("\t", @$row);
}

die $parser->errstr if $parser->errstr;

输出:

1234    text1,text2
5678    text3
90      text4,text5

请注意,性能会很差,因为Parse::CSV正在为您拆分列,但之后会立即将它们重新连接在一起。

但是,由于您似乎没有使用真正的CSV(包含分隔符的列未以任何方式引用或转义),为什么不将split与第三个一起使用参数指定最大字段数?

use strict;
use warnings;
use 5.010;

open my $fh, '<', 'input.csv' or die $!;

while (<$fh>) {
    chomp;

    my @fields = split(',', $_, 2);
    say join("\t", @fields);
}

close $fh;