Perl中的Text :: Csv模块,在csv

时间:2016-04-06 09:30:54

标签: perl csv

Text::CSV的概要中有这个例子

my @rows;
my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
        or die "Cannot use CSV: ".Text::CSV->error_diag ();

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";

while ( my $row = $csv->getline( $fh ) ) {
    $row->[2] =~ m/pattern/ or next; # 3rd field should match
    push @rows, $row;
}

$csv->eof or $csv->error_diag();
close $fh;

$csv->eol ("\r\n");

open $fh, ">:encoding(utf8)", "new.csv" or die "new.csv: $!";
$csv->print ($fh, $_) for @rows;
close $fh or die "new.csv: $!";

我看到它在数组@rows上推送了一些行,然后在输出文件中逐行打印数组。

我需要做类似的事情(比如检查一个模式然后保存行以便稍后在另一个文件上重写它)但是我需要每行只有一个字段,我需要向{{添加新字段1}}被推了。我该怎么做?

1 个答案:

答案 0 :(得分:1)

当您的要求过于模糊时很难提供解决方案,但一般原则是,不应将$row推送到@rows数组,而应推送引用包含输出中所需数据的数组。为此

使用匿名数组很方便

假设您希望输出为A,后跟行中的第三列,后跟Z。然后你会像这样改变while循环

您必须更改测试以进行所需的检查

while ( my $row = $csv->getline($fh) ) {
    next unless $row->[2] =~ /pattern/;
    push @rows, [ 'A', $rows->[2], 'Z' ];
}