仅保留CSV文件中的某些字段

时间:2014-04-11 15:09:34

标签: perl csv

我有几个包含很多字段的CSV文件,但我只需要保留其中一些,所以我想在导入之前删除额外的数据。

我想跑步:

perl -i.bak -F, -ane 'BEGIN {$,=","} print @F[3..6], @F[9..12]' file.csv

虽然引用了文本字段,但某些字段包含逗号,而这个简单的解决方案不起作用。

1 个答案:

答案 0 :(得分:2)

使用Text::CSV。它处理包含分隔符的字段,以及许多其他不错的功能。

use strict;
use warnings;

use File::Copy;
use Text::CSV;

my $csv = Text::CSV->new({
    binary => 1,
    auto_diag => 1,
    eol => $/,
    always_quote => 1
}) or die 'Cannot use CSV: ' . Text::CSV->error_diag();

my $file = 'input.csv';
my $backup = "$file.bak";
copy $file, $backup or die "Copy failed: $!";

open my $in_fh, '<', $backup or die "$backup: $!";
open my $out_fh, '>', $file or die "$file: $!";

while (my $row = $csv->getline($in_fh)) {
    my @wanted = @$row[3..6,9..12];
    $csv->print($out_fh, \@wanted);
}

close $in_fh;
close $out_fh;