来自mysql数据的Perl输出矩阵。跨越2轴的输出,每个轴都有计数

时间:2014-03-17 07:09:55

标签: mysql perl

我是新成员,但是很长时间的读者;我从这里的人那里学到了很多东西。

我正在尝试使用perl来获取一些mysql输出格式。

我有2个输出列,cartypes&制造商,以及第三个输出数量。

我一直在尝试使用散列引用来基本列​​出y轴下的购物车类型,以及跨越x的汽车制造商,并通过基本填充矩阵来计算。

所以雪佛兰4x4卡车的数量。如果没有匹配,希望包括0。时间帧在sql中处理,不影响计数以外的输出。

并且,如果可能的话,如何总计行数和列数将是理想的。 CSV可能是最终产品。

我只是不知道如何开始。任何指导将不胜感激。谢谢。

示例数据

cartype Manufacturer    count(*)
Convertible Audi    3
Convertible Chrysler    1
Coupe   Aston   5
Coupe   Audi    2
Coupe   Chrysler    2
Etc     Etc     0
Minivan Chevy   2
Minivan Chrysler    6
Minivan Dodge   3
Minivan Ford    4
SUV Audi    2
SUV Buick   1
SUV Dodge   2
SUV Ford    5
Sedan   Audi    3
Sedan   Buick   2
Sedan   Chevy   3
Sedan   Chrysler    2
Sedan   Dodge   2
Sedan   Ford    5

希望输出

    Aston   Audi    Buick   Chevy   Chrysler    Dodge   Ford    etc TOTAL
Convertible 0   3   0   0   1   0   0   0   4
Coupe   5   2   0   0   2   0   0   0   9
Minivan 0   0   0   2   6   3   4   0   15
SUV 0   2   1   0   0   2   5   0   10
Sedan   0   3   2   3   2   2   5   0   17
etc 0   0   0   0   0   0   0   0   0
TOTAL   5   10  3   5   11  7   14  0   55

感谢Oesor重新格式化。非常感谢。

1 个答案:

答案 0 :(得分:0)

这是一个使用Text :: Table格式化输出的解决方案。

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'sum';
use Text::Table;

my (%data, %makes);
while (<DATA>) {
    my ($type, $make, $cnt) = split;
    $data{$type}{$make} += $cnt;
    $makes{$make} += $cnt;
}

my @makes_list = sort keys %makes;
my $tb = Text::Table->new('', @makes_list, 'Total');

for my $type (sort keys %data) {
    my $total = sum values $data{$type};
    $tb->load([ $type, map {$_ // 0} @{$data{$type}}{@makes_list}, $total ]);
}

$tb->load([ 'TOTAL', @makes{@makes_list}, sum values %makes ]);

print $tb;
__DATA__
Convertible Audi    3
Convertible Chrysler    1
Coupe   Aston   5
Coupe   Audi    2
Coupe   Chrysler    2
Minivan Chevy   2
Minivan Chrysler    6
Minivan Dodge   3
Minivan Ford    4
Etc     Etc     0
SUV Audi    2
SUV Buick   1
SUV Dodge   2
SUV Ford    5
Sedan   Audi    3
Sedan   Buick   2
Sedan   Chevy   3
Sedan   Chrysler    2
Sedan   Dodge   2
Sedan   Ford    5

输出

            Aston Audi Buick Chevy Chrysler Dodge Etc Ford Total
Convertible 0     3    0     0     1        0     0   0     4
Coupe       5     2    0     0     2        0     0   0     9
Etc         0     0    0     0     0        0     0   0     0
Minivan     0     0    0     2     6        3     0   4    15
SUV         0     2    1     0     0        2     0   5    10
Sedan       0     3    2     3     2        2     0   5    17
TOTAL       5     10   3     5     11       7     0   14   55
使用Text :: CSV

更新程序

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'sum';
use Text::CSV_XS;

my (%data, %makes);
while (<DATA>) {
    my ($type, $make, $cnt) = split;
    $data{$type}{$make} += $cnt;
    $makes{$make} += $cnt;
}

my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ }) or
     die "Cannot use CSV: ".Text::CSV_XS->error_diag ();

open my $fh, ">", 'o33.csv' or die $!;

my @makes_list = sort keys %makes;

$csv->print($fh, ['', @makes_list, 'Total'] );

for my $type (sort keys %data) {
    my $total = sum values $data{$type};
    $csv->print($fh, [ $type,
                        map {$_ // 0} @{$data{$type}}{@makes_list},
                        $total ]);
}

$csv->print($fh, [ 'TOTAL', @makes{@makes_list}, sum values %makes ]);
close $fh or die $!;

__DATA__
Convertible Audi    3
Convertible Chrysler    1
Coupe   Aston   5
Coupe   Audi    2
Coupe   Chrysler    2
Minivan Chevy   2
Minivan Chrysler    6
Minivan Dodge   3
Minivan Ford    4
Etc     Etc     0
SUV Audi    2
SUV Buick   1
SUV Dodge   2
SUV Ford    5
Sedan   Audi    3
Sedan   Buick   2
Sedan   Chevy   3
Sedan   Chrysler    2
Sedan   Dodge   2
Sedan   Ford    5