使用 perl 分割文件

使用 perl 分割文件

我有一个 csv 文件,并且喜欢使用 perl 根据文件中的列匹配将文件拆分为更小的文件。我正在 Linux Rhel6 上工作。

例子:

fruit1, fruit2,pricerate,quantity
orange, apple, 3,9
apple,lemon,8,1
orange, apple,3,8
pineapple,papaya,9,19
orange,apple,3,7
pineapple,papaya,9,10

输出类似于:

文件1:

fruit1,fruit2,pricerate,quantity
orange,apple, 3,9
orange,apple,3,8
orange,apple,3,7

文件2:

fruit1,fruit2,pricerate,quantity
pineapple,papaya,9,19
pineapple,papaya,9,10

不匹配的进入一个单独的文件。说文件3。

答案1

解决此问题的方法之一是:

  • 打开输入文件
  • 存储输入文件的第一行(标题)
  • 对于输入文件中标头之后的每一行:

    • 阅读前两列
    • 如果我们尚未打开要匹配的字段的输出文件,请打开一个新的输出文件并将其文件句柄存储在哈希中。将标题行也写入新的输出文件。
    • 从文件句柄哈希中获取我们应该存储此行的输出文件的句柄。将该行写入该文件。

下面是一些示例代码,它将匹配前两个字段:

#!/usr/bin/perl

use strict;
use warnings;

my %filehandles=();
my $filenum=1;

open INPUT, "fruit.csv" 
    or die "Cannot open input file.";

my $header = <INPUT>;

while ( <INPUT> )
{   # Remove spaces from input 
    $_ =~ s/ //g;

    my @fields = split ',', $_;

    if ( ! $filehandles{$fields[0]}{$fields[1]} )
    {   open $filehandles{$fields[0]}{$fields[1]} , ">file$filenum"
            or die "Cannot open output file file$filenum.";
        print {$filehandles{$fields[0]}{$fields[1]}} $header;
        $filenum++;
    }
    print {$filehandles{$fields[0]}{$fields[1]}} $_;
}

相关内容