-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

関数のカウント、最大、最小 (2 列目) の経過時間 (3 列目) を各時間 (1 列目) で見つけたい。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

ハッシュのハッシュを使用します。最初のレベルのキーは時間で、2 番目のレベルのキーは関数名です。値は、すべてのデータ ポイントを含む配列参照になります。次に、最小値/最大値を抽出できます。または、現在の最小/最大値を保持し、新しい値ごとにこれらに対してテストすることもできます。

入力を解析するには、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 に答える