我目前有一个csv文件,如下所示:
a,b
a,d
a,f
c,h
c,d
Run Code Online (Sandbox Code Playgroud)
所以我将这些保存到散列中,使得键"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);
Run Code Online (Sandbox Code Playgroud)
不确定效率,但似乎在我进行数据转储时有效...
现在,我遇到的问题是这个; 我想为每个键创建一个新文件,在每个文件中我想打印键中的每个元素,如下所示:
文件"a"看起来像这样:
b
d
f
<end of file>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我尝试过的一切都不起作用,我对哈希不太熟悉/经验......
提前致谢 :)
#!/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");
}
}
Run Code Online (Sandbox Code Playgroud)
我编写了内部循环,就像我所做的那样,展示了读写之间的对称性,但它也可以写成如下:
print($fh_out "$_\n") for @{ $foos_by_cat{$cat} };
Run Code Online (Sandbox Code Playgroud)
使用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;
}
Run Code Online (Sandbox Code Playgroud)