我有一个 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]}} $_;
}