#!/usr/bin/perl -w # 使用範例: # 統計各年度獲補助案件最多的 10 個關鍵詞: # ./e15424.txt data.csv > result.svg # 統計各年度獲補助 <金額> 最多的 10 個關鍵詞: # ./e15424.txt -a amount data.csv > result.svg # 統計各年度獲補助 <金額> 最多的 <16> 個關鍵詞: # ./e15424.txt -a amount -t 16 data.csv > result.svg use strict; use Getopt::Std; use SVG; use Digest::MD5 qw(md5_hex); my (%opts, $DB, $rec); %opts = ( k => "keyword", # use which field as keyword? a => "", # accumulation method: count or amount? t => 10, # how many top entries to include? ); getopts('k:a:t:', \%opts); while (<>) { chomp; my (%r); @r{qw(year moe inst leader col keyword id class amount)} = split(/,/); next if ($r{year} =~ /^\s*$/ or $r{year} =~ /^#/); unless ($r{amount} =~ /^\d+$/) { printf STDERR "%3d | $_\n", $.; next; } # print "$#$DB $r{year} $r{amount}\n"; push @$DB, \%r; } my ($fav_kw); foreach $rec (@$DB) { foreach my $kw (split(/、/, $rec->{$opts{k}})) { next unless $kw; my ($yr) = $rec->{year}; if ($opts{a} eq "amount") { $fav_kw->{$yr}{$kw} += $rec->{amount}; } else { ++$fav_kw->{$yr}{$kw}; } } } my ($svg) = SVG->new( width => 800, height => 600, ); foreach my $yr (keys %$fav_kw) { my ($foy); # favourites of the year foreach my $kw (keys %{$fav_kw->{$yr}}) { push @$foy, { kw=>$kw, dof=>$fav_kw->{$yr}{$kw} }; } @$foy = sort { $b->{dof} <=> $a->{dof} } @$foy; for (my $i=0; $i<$opts{t}; ++$i) { my ($f) = $foy->[$i]; my ($ht) = 500 / $opts{t}; $svg->rectangle( x => ($yr - 96) * 90 + 40, y => $i * $ht + 30, width => $f->{dof} * 80 / $foy->[0]{dof}, height => $ht*0.8, style => { 'fill' => kw2color($f->{kw}) } ); $svg->text( x => ($yr - 96) * 90 + 40, y => ($i + 0.6) * $ht + 30, 'font-size' => 200 / $opts{t}, '-cdata' => $f->{kw} ); } $svg->text( x => ($yr - 96) * 90 + 40, y => 560, 'font-size' => 20, '-cdata' => $yr, ); } my $out = $svg->xmlify; $out =~ s|&#(\d+);&#(\d+);&#(\d+);|chr($1) . chr($2) . chr($3)|meg; print $out; #print "sort by 獲補助次數\n"; #@leaders = sort { $a->{count} - $b->{count} } @leaders; #foreach $ldr (@leaders) { # print "$ldr->{leader} $ldr->{count}\n"; #} # sub kw2color { my ($kw) = @_; my ($md5) = md5_hex($kw); return "rgb(" . hex(substr($md5,0,2)) . "," . hex(substr($md5,2,2)) . "," . hex(substr($md5,4,2)) . ")"; }