【问题标题】:How to merge multiple lines in a csv file using Perl如何使用 Perl 合并 csv 文件中的多行
【发布时间】:2013-11-07 21:00:22
【问题描述】:

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

【问题讨论】:

  • 我们想看看你的代码

标签: perl csv


【解决方案1】:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案3】:

      这是另一个选择:

      use strict;
      use warnings;
      
      my %hash;
      while (<>) {
          $hash{$1} .= $2 if /(.+?)(,.+)/;
      }
      
      print "$_$hash{ $_ }\n" for sort keys %hash;
      

      用法:perl script.pl inFile [&gt;outFile]

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

      数据集上的输出:

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 2012-11-16
        • 2021-07-03
        • 1970-01-01
        • 2020-11-28
        • 2020-07-22
        • 2021-05-17
        • 2023-02-14
        • 1970-01-01
        相关资源
        最近更新 更多