我是新成员,但是很长时间的读者;我从这里的人那里学到了很多东西。
我正在尝试使用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重新格式化。非常感谢。
答案 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