我目前有一个csv文件,如下所示:
a,b
a,d
a,f
c,h
c,d
所以我将这些保存到哈希中,以便键和#34; a"是" b,d,f"和关键" c"是一个带有" h,d"的数组......这就是我用过的:
while(<$fh>)
{
chomp;
my @row = split /,/;
my $cat = shift @row;
$category = $cat if (!($cat eq $category)) ;
push @{$hash{$category}}, @row;
}
close($fh);
不确定效率,但在我进行数据转储时似乎有效......
现在,我遇到的问题是这个;我想为每个键创建一个新文件,在每个文件中我都要打印键中的每个元素,如下:
file&#34; a&#34;看起来像这样:
b
d
f
<end of file>
有什么想法吗?我尝试过的所有东西都不起作用,我对哈希不太熟悉/经验......
提前致谢:)
答案 0 :(得分:5)
#!/usr/bin/perl
use strict;
use warnings;
my %foos_by_cat;
{
open(my $fh_in, '<', ...) or die $!;
while (<$fh_in>) {
chomp;
my ($cat, $foo) = split /,/;
push @{ $foos_by_cat{$cat} }, $foo;
}
}
for my $cat (keys %foos_by_cat) {
open(my $fh_out, '>', $cat) or die $!;
for my $foo (@{ $foos_by_cat{$cat} }) {
print($fh_out "$foo\n");
}
}
我正如我所做的那样编写了内部循环来展示读写之间的对称性,但它也可以写成如下:
print($fh_out "$_\n") for @{ $foos_by_cat{$cat} };
答案 1 :(得分:5)
使用each
迭代器,输出过程非常简单,它为单个调用中的下一个哈希元素提供键和值对
use strict;
use warnings;
use autodie;
open my $fh, '<', 'myfile.csv';
my %data;
while (<$fh>) {
chomp;
my ($cat, $val) = split /,/;
push @{ $data{$cat} }, $val;
}
while (my ($cat, $values) = each %data) {
open my $out_fh, '>', $cat;
print $out_fh "$_\n" for @$values;
}