将数据存储到散列中以获得灵活的“数据透视表”(如计算)的最佳方法

时间:2011-04-17 10:50:49

标签: perl hash count

我有一个包含以下字段的数据集。

主机名,型号,位置,端口号,已激活?,向上?

我会将它们转换为哈希结构(可能类似于下面的)

my %switches = (
    a => {
        "hostname" => "SwitchA",
        "model" => "3750",
        "location" => "Building A"
        "total_ports" => 48,
        "configured_ports" => 30,
        "used_ports" => 24,
    },
    b => {
        "hostname" => "SwitchB",
        "model" => "3560",
        "location" => "Building B"
        "total_ports" => 48,
        "configured_ports" => 36,
        "used_ports" => 20,
    },        
},
);

最后我想生成统计数据,例如:  每栋建筑的开关数量,  每栋建筑的每个型号的开关数量  总数没有。每个建筑物的港口数量

统计数据可能不仅仅局限于建筑物,甚至可能基于开关(即,95%使用的开关等等)。使用给定的数据结构,我如何枚举这些计数器?

相反,有没有更好的方法来存储我的数据?我能想到至少一种格式:

 <while iterating over records>
 {
 hash{$location}->{$model_name}->count++;
 if ($State eq 'Active') {hash{$location}->{up_ports}->count++};

最好的方法是什么?如果我选择第一种格式(哈希中所有信息都完好无损),我如何将数据混合以产生不同的统计数据? (一些示例代码片段会有很大的帮助!)

2 个答案:

答案 0 :(得分:2)

如果您想要查询灵活性,“数据库”策略通常是好的。您可以通过将数据放入SQLite之类的内容来直接执行此操作。根据这种方法,您可以针对数据发出各种各样的查询,而无需编写自己的编码。

或者,如果您正在寻找一种纯粹的Perl方法,那么近似数据库表的方法是使用数组数组,或者更好的代码可读性,即散列数组。外部数组类似于数据库表。该数组中的每个哈希都像一个数据库记录。您的基于Perl的查询最终会如下所示:

my @query_result = grep {
    $_->{foo} == 1234 and
    $_->{bar} eq 'fubb'
} @data;

如果您有很多行,查询性能成为瓶颈,您可以使用哈希创建自己的索引。

%data_by_switch = (
    'SwitchA' => [0, 4, 13, ...],  # Subscripts to @data.
    'SwitchB' => [1, 12, ...],
    ...
);

我的回答是根据我收到的this question的答案,与您的问题有一些相似之处。

答案 1 :(得分:1)

据我所知,你有一个元组列表,为了讨论起见,考虑具有2个属性的对象就足够了,例如location和ports_used。所以,例如:

(["locA", 23], ["locB", 42], ["locA", 13])  # just the values as tuples, no keys

你想得到一个结果:

("locA" => 36, "locB" => 42)

这是对的吗?如果是这样,你面临的问题是什么?