我已经用头撞墙了几个小时了。
我有一个看起来像这样的数据结构(来自“Data::Dumper”的输出)。这是我自己的错,我在解析一些输入时创建了数据结构。
print Dumper $data;
___OUTPUT___
$VAR = { 'NAME' => {
'id' => '1234',
'total' => 192,
'results' => {
'APPLE' => 48 ,
'KUMQUAT' => 61 ,
'ORANGE' => 33 ,
}
}
}
- 有数千个“NAME”键。
- 只有一个“id”和一个“total”。
- “结果”散列中可能有一个或多个键/值对。
我想打印出一个逗号分隔的列表,首先按“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”。
- “结果”数组中可能有一个或多个哈希值。
- “结果”数组中的每个散列将只有一个名称/值对。
不管有没有人读到这里,我不得不说写下来是相当有治疗作用的,所以我会继续……;-)
对于新的数据结构,我的排序/打印代码有问题。
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 等价物)并存储结果。)
谢谢