-10

我在一个大文件中有以下数据

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
4

1 回答 1

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;
    ...;
  }
}
于 2013-08-16T21:19:18.197 回答