ここ数時間、頭を壁にぶつけています。
このようなデータ構造があります (「Data::Dumper」からの出力)。それは私自身のせいです。入力を解析しているときにデータ構造を作成しています。
print Dumper $data;
___OUTPUT___
$VAR = { 'NAME' => {
'id' => '1234',
'total' => 192,
'results' => {
'APPLE' => 48 ,
'KUMQUAT' => 61 ,
'ORANGE' => 33 ,
}
}
}
- 何千もの「NAME」キーがあります。
- 「id」と「total」は常に 1 つだけです。
- 「結果」ハッシュには、1 つ以上のキーと値のペアが含まれる場合があります。
最初に「合計」でソートし、次に「結果」配列の各ハッシュの値でソートしたコンマ区切りのリストを出力したいと考えています。
次のコードは、既に保存されているデータ構造から CSV を出力するために使用されました。
use strict;
use warnings;
# [...lots of other stuff...]
open (my $fh, >out.csv);
print $fh "Name, ID, Label, Count, Total\n";
foreach ( sort { $data->{$b}->{total} <=> $data->{$a}->{total} }
keys %{$data} )
{
my $name = $_;
foreach (
sort {
$data->{$name}->{results}->{$a} <=> $data->{$name}->{results}
->{$b}
} values %{ $data->{$name}->{results} }
)
{
print $fh $name . ","
. $data->{$name}->{id} . "," . "'"
. $_ . ","
. $data->{$name}->{results}->{$_} . "," . "\n";
}
print $fh $name . ","
. $data->{$name}->{id} . "," . "," . ","
. $data->{$name}->{total} . "\n";
}
close($fh);
これは問題なく、うまく機能しました (なぜ私がもう Perl を使わないのかを思い出すことは別として)。
出力例は次のようになりました。
Name, ID, Label, Count, Total
foo, 1234, ORANGE, 33,
foo, 1234, APPLE, 48,
foo, 1234, KUMQUAT, 61,
foo, 1234, , , 142
bar, 1101, BIKE, 20,
bar 1101, , , 20
でも!(「結果」ハッシュで)キーの衝突が発生していることに気付き、すべてのデータを保持して報告する必要があるため、「結果」をハッシュの配列に変更してみることにしました...
print Dumper $data;
___OUTPUT___
$VAR = { 'NAME' => {
'id' => '1234',
'total' => 192,
'results' => [
{ 'APPLE' => 48 },
{ 'KUMQUAT' => 61 },
{ 'ORANGE' => 33 },
{ 'APPLE' => 50 },
]
}
}
- 何千もの「NAME」キーがあります。
- 「id」と「total」は常に 1 つだけです。
- "results" 配列には 1 つ以上のハッシュが含まれる場合があります。
- "results" 配列内の各ハッシュには、名前と値のペアが 1 つだけ含まれます。
誰かがここまで読んだかどうかにかかわらず、これを書き留めるのはかなり治療的だと言わざるを得ないので、続けます... ;-)
新しいデータ構造については、ソート/印刷コードに問題があります。
use strict;
use warnings;
# [...lots of other stuff...]
open (my $fh, >out.csv);
print $fh "Name, ID, Label, Count, Total\n";
foreach ( sort { $data->{$b}->{total} <=> $data->{$a}->{total} }
keys %{$data} )
{
my $name = $_;
foreach (
sort {
$data->{$name}->{results}->{$a} <=> $data->{$name}->{results}
->{$b}
} values %{ $data->{$name}->{results} }
)
{
# .... HELP ME FOR THE LOVE OF ALL THAT IS GOOD IN THE WORLD! ....
# I'm at the point now where my brain is starting to slowly dribble from my
# ears...
}
print $fh $name . ","
. $data->{$name}->{id} . "," . "," . ","
. $data->{$name}->{total} . "\n";
}
close($fh);
あなたがここまで読んだなら、私はあなたに敬意を表します。あなたが助けてくれるなら、私はあなたに拍手を送ります。
データ構造の代替フォーマットについて提案がある場合は、お知らせください。(興味がある方のために...「フリップフロップ」演算子を使用してソース ファイルのブロックをキャプチャし、それを行ごとに使用してデータ構造を作成しています。特定のものを計算し (Perl に相当するものはありません)、結果も保存するプログラム)。
ありがとう