1

请帮助我编写将合并 csv 文件行的代码。我的 csv 文件如下图所示,

输出.csv

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

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

输出.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 并尝试哈希。但是当我尝试将数组转换为哈希时,我被卡住了。我在这里有点困惑。请帮帮我。

4

3 回答 3

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
于 2013-11-07T21:31:01.250 回答
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;
于 2013-11-07T21:31:48.850 回答
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

希望这可以帮助!

于 2013-11-08T00:35:29.077 回答