使用Perl进行数据整合

时间:2013-08-16 21:10:47

标签: perl

我在大文件中有以下数据

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

1 个答案:

答案 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;
    ...;
  }
}