我在大文件中有以下数据
8915, fun1, 10
8915, fun1, 8
8915, fun1, 12
8915, fun2, 5
8915, fun2, 6
8915, fun2, 4
8916, fun1, 12
8916, fun1, 13
8916, fun2, 4
8916, fun2, 5
我想找到每小时(第一列)的功能(第二列)经过时间(第三列)的计数,最大值,最小值。 Perl中最简单的方法是什么?我的计划是使用多维数组,请建议。
HR COUNT MIN MAX
8915
fun1 3 8 12
fun2 3 4 6
8916
fun1 2 12 13
fun2 2 4 5
答案 0 :(得分:3)
使用哈希散列,其中第一级键是一小时,第二级键是函数名。然后,这些值将是包含所有数据点的arrayrefs。然后,您可以提取最小/最大值。或者您可以保留当前的最小值/最大值,并针对每个新值进行测试。
要解析输入,我建议使用Text::CSV
模块。
代码看起来有点像:
use List::Util qw/min max/;
my %times;
while (my ($hour, $fun, $val) = ...) {
push @{ $times{$hour}{$fun} }, $val;
}
for my $hour (sort { $a <=> $b } keys %times) {
my $funs = $times{$hour};
for my $fun (sort keys %$funs) {
my $vals = $funs->{$fun};
my $count = @$vals;
my $min = min @$vals;
my $max = max @$vals;
...;
}
}