データをよりアクセスしやすくするために、表形式のデータを複雑なハッシュに格納したいと考えています。スクリプトがデータをループするので、「HoHoHoA」を成長させようとしています。「perldsc」のガイドラインに従って:
push @ { $hash{$column[$i]}{$date}{$hour} }, $data[$i];
スクリプトは問題なくコンパイルおよび実行されますが、ハッシュにデータは追加されません。
print $hash{"Frequency Min"}{"09/07/08"}{"15"};
キーが存在する必要がありますが、何も返しません。ハッシュに対して「exists」を実行すると、ハッシュが存在しないことが示されます。
私が読んでいるデータファイルは次のようになります。
DATE TIME COLUMN1 COLUMN2 COLUMN3...
09/06/2008 06:12:56 56.23 54.23 56.35...
09/06/2008 06:42:56 56.73 55.28 54.52...
09/06/2008 07:12:56 57.31 56.79 56.41...
09/06/2008 07:42:56 58.24 57.30 58.86...
.
.
.
特定の日付と時間の配列内の各列の値をグループ化したいので、{COLUMN}、{DATE}、および {HOUR} の 3 つのハッシュを作成します。
結果の構造は次のようになります。
%monthData = (
"COLUMN1" => {
"09/06/2008" => {
"06" => [56.23,56.73...],
"07" => [57.31,58.24...]
}
},
"COLUMN2" => {
"09/06/2008" => {
"06" => [54.23,55.28...],
"07" => [56.79,57.30...]
}
},
"COLUMN3" => {
"09/06/2008" => {
"06" => [56.35,54.52...],
"07" => [56.41,58.86...]
}
}
);
私のコードを見てください:
use feature 'switch';
open DATAFILE, "<", $fileName or die "Unable to open $fileName !\n";
my %monthData;
while ( my $line = <DATAFILE> ) {
chomp $line;
SCANROWS: given ($row) {
when (0) { # PROCESS HEADERS
@headers = split /\t\t|\t/, $line;
}
default {
@current = split /\t\t|\t/, $line;
my $date = $current[0];
my ($hour,$min,$sec) = split /:/, $current[1];
# TIMESTAMP FORMAT: dd/mm/yyyy\t\thh:mm:ss
SCANLINE: for my $i (2 .. $#headers) {
push @{ $monthData{$headers[$i]}{$date}{$hour} }, $current[$i];
}
}
}
}
close DATAFILE;
foreach (@{ $monthData{"Active Power N Avg"}{"09/07/08"}{"06"} }) {
$sum += $_;
$count++;
}
$avg = $sum/$count; # $sum and $count are not initialized to begin with.
print $avg; # hence $avg is also not defined.
私の必要性が十分に明確であることを願っています。これらのサブハッシュ内の配列に値を追加するにはどうすればよいですか?