在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}}被推了。我该怎么做?
答案 0 :(得分:1)
当您的要求过于模糊时很难提供解决方案,但一般原则是,不应将$row
推送到@rows
数组,而应推送引用包含输出中所需数据的数组。为此
假设您希望输出为A
,后跟行中的第三列,后跟Z
。然后你会像这样改变while
循环
您必须更改测试以进行所需的检查
while ( my $row = $csv->getline($fh) ) {
next unless $row->[2] =~ /pattern/;
push @rows, [ 'A', $rows->[2], 'Z' ];
}