Я уже пару часов бьюсь головой об стену.
У меня есть структура данных, которая выглядит примерно так (вывод «Data :: Dumper»).Это моя вина, я создаю структуру данных, когда анализирую некоторые данные.
print Dumper $data;
___OUTPUT___
$VAR = { 'NAME' => {
'id' => '1234',
'total' => 192,
'results' => {
'APPLE' => 48 ,
'KUMQUAT' => 61 ,
'ORANGE' => 33 ,
}
}
}
- Существуют тысячи ключей "NAME".
- Есть толькокогда-либо один "id" и один "total".
- В хэше "results" может быть одна или несколько пар ключ / значение.
Я хочу распечатать запятуюразделенный список, сначала отсортированный по «итогу», а затем по значению каждого хеша в массиве «результатов».
Следующий код был использован для распечатки 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".
- Может быть один или несколько хэшеймассив «results».
- Каждый хэш в массиве «results» будет иметь только одну пару имя / значение.
Независимо от того, читал ли кто-нибудь это далеко, яДолжен сказать, что это довольно полезно записывать, поэтому я продолжу ...; -)
Для новой структуры данных у меня возникла проблема с кодом сортировки / печати.
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);
Если вы прочли это далеко, я приветствую вас.Если вы можете помочь, я приветствую вас.
Если у кого-то есть предложения по поводу альтернативного формата структуры данных, пожалуйста, дайте мне знать!(Если вам интересно ... Я использую оператор "flip-flop" для захвата блоков исходного файла, который я затем использую, построчно, для создания структуры данных. Я также называю externalпрограммы для вычисления определенных вещей (без эквивалентов Perl) и сохранения результатов.)
Спасибо