如何使用Perl合并csv文件中的多行

时间:2013-11-07 21:00:23

标签: perl csv

请帮我写一个合并csv文件行的代码。我的csv文件如下所示,

output.csv

abc,1,2,3,4,5
abc,3,5,60,3
abc,4,5,6
def,2,5,6,7
def,3,4,5,6

这只是一个例子。我的csv文件数据每次都在不断变化。因此,它不限于abc(3行)或def(2行)。 请帮我把代码放到我的csv文件中,如下所示:

output.csv

abc,1,2,3,4,5,3,5,60,3,4,5,6
def,2,5,6,7,3,4,5,6

我尝试使用Text :: CSV读取csv并尝试使用哈希。但是当我尝试将数组转换为哈希时,我陷入困境。我在这里有点困惑。请帮帮我。

3 个答案:

答案 0 :(得分:4)

假设第一个字段不包含逗号:

perl -nle '
    ($key,$vals) = /^([^,]+),(.*)/;
    push @{$final_lines{$key}},$vals;
    END{
        for $key (sort keys %final_lines){
            print join ",",$key,@{$final_lines{$key}}
        }
    }
' < input_file > output_file

答案 1 :(得分:2)

#!/usr/bin/perl
use strict;
use warnings;

my %hash;

open my $ifh, '<', 'input.csv' or die $!;
open my $ofh, '>', 'output.csv' or die $!;

while (<$ifh>) {
  chomp;
  my @F = split /,/;
  my $key = shift @F;
  push @{$hash{$key}}, @F;
}

foreach (sort keys %hash) {
  print $ofh "$_," . join (',', @{$hash{$_}}) . "\n";
}

close $ifh;
close $ofh;

答案 2 :(得分:1)

这是另一种选择:

use strict;
use warnings;

my %hash;
while (<>) {
    $hash{$1} .= $2 if /(.+?)(,.+)/;
}

print "$_$hash{ $_ }\n" for sort keys %hash;

用法:perl script.pl inFile [>outFile]

最后一个可选参数将输出定向到文件。

数据集输出:

abc,1,2,3,4,5,3,5,60,3,4,5,6
def,2,5,6,7,3,4,5,6

希望这有帮助!