从perl中的DB分组两列

时间:2011-11-08 13:54:48

标签: perl

我正在编写一个需要分组的脚本,我无法在SQL中执行这些操作。我得到的结果是ArrayReference。我对DB的查询返回类似这样的内容。

1234 TIN
32364 TIN
34367 BOX
87484 TIN
45674 BOX
45476 TIN
4575  BOX

我希望将它们分组为:

These are the list of BOX: 4575,45674,34367.

These are the list of TIN: 1234,32364,87484,45476.

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果您坚持不使用数据库,则以下代码将执行基本分组。

# Assume data is in @rows
my %group;
push @{ $group{$_->[1]} }, $_->[0] for @rows;

while (my ($key, $items) = each %group) {
    print "These are the list of $key: ". join(',', @$items) .".\n";
}

答案 1 :(得分:0)

那么你的数组引用到底是什么样的?

是这样的数组数组:

@myArray = [
              [
                  1234,
                  TIN,
              ]
              [
                  32364,
                  TIN,
              ]
                  34367,
                  BOX,
              ]
          ]

或一系列哈希:

       =  [
              {
                  NUMBER => 1234,
                  TYPE   => TIN,
              }
          ]

或者每一行是fetch某种形式的单一回报?使用DBI接口从数据库返回数据有五种不同的方法:

  • fetchrow_arrayref
  • fetchrow_array
  • fetchrow_hashref
  • fetchall_arrayref
  • fetchall_hashref

假设你使用了fetchall_arrayref,这是一个可以做你想做的示例程序:

use strict;
use warnings;
use feature qw(say switch);
use Data::Dumper;

my $fetchedSqlData = [
                  [ qw(1234 tin) ],
                  [ qw(3434 box) ],
                  [ qw(4341 tin) ],
                  [ qw(2343 box) ],
              ];


my @tinList;
my @boxList;

foreach my $row (@{$fetchedSqlData}) {
    if ($row->[1] eq "tin") {
        push @tinList => $row->[0];
    }
    else {
        push @boxList => $row->[0];
    }

}

say "These are the list of BOX: " . join ", " => @boxList;
say "These are the list of TIN: " . join ", " => @tinList;

更好的方法是根据第2列中的值获得单个散列,并且每个散列都是对数组的引用:

my %typeHash;
foreach my $row (@{$fetchedSqlData}) {
    $typeHash{$row->[1]} = [] if not exist $typeHash{$row->[1]};
    push @{$typeHash{$row->[1]}} => $row->[0];
}

这有点令人困惑,但如果您在列表中添加“CRATE”类型,则会更灵活。

从中打印出来的数据将是:

foreach my $type (sort keys %typeHash) {
    say "These are the list of $type: " . join ", " => $typeHash{$type}->[0];
}
顺便说一下,我没有测试这个数组的哈希,所以期待编码错误。而且,是的,我知道我不必做$typeHash{$row->[1]) = [] if not exists $typeHash{$row->[1]},但我喜欢这样做,因为它确保我在哈希元素中存储正确类型的数据。

要彻底测试,我必须构建一个数据库,然后执行DBI fetchall_arrayref以确切地验证数据的返回方式。我基于我上次使用它和文档时DBI如何工作的不稳定记忆。

可能有一种方法可以使用map执行此操作,但我通常没有发现map比简单循环更有效。