No I can't sort the data first as it is being used on a bar chart where the x-axis is the date.
Some sort of sort needs to actually go on within GD::Graph to sort the columns before drawing them.
use GD::Graph::lines;
use GD::Graph::bars;
$suffix = @ARGV[0]; #Suffix
$accur = @ARGV[1]; #Accuracy
$mode = @ARGV[2]; #Mode (se - start/end or fd - full day)
if ($accur eq "" || $suffix eq ""){print "Usage: perl WAC.pl [suffix]
+[hour minute] <fd se>"; exit;}
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time
+);
$year = $year+1900;
$hour = sprintf("%.2d",$hour);
$min = sprintf("%.2d",$min);
$sec = sprintf("%.2d",$sec);
@plot_legend = ('Exceptions','Successes','WAC_002','Errors');
&check_usage();
&read_data();
&date_setup();
&date_hash();
&parse_data();
&plot_prepare();
&plot_graph();
print "Graph OK\n";
sub plot_prepare(){
foreach (sort(keys %date_plots)){
push(@plots_date,$_);
push(@plots_exception,$exception{$_});
push(@plots_success,$success{$_});
push(@plots_wac,$wac{$_});
push(@plots_error,$error{$_});
#print "$_ -> $success{$_}\n";
}
}
sub parse_data(){
my %line;
foreach (@data){
chomp($_);
%line = &return_data($_);
#print "$line{date_string}\n";
if ($l_msg =~ "Exception"){$exception{$line{date_string}} = $l
+ine{l_count};}
if ($l_msg =~ "Success"){$success{$line{date_string}} = $line{
+l_count};}
if ($l_msg =~ "wac_002"){$wac{$line{date_string}} = $line{l_co
+unt};}
if ($l_msg =~ "Errorcode" && $l_msg !~ "wac_002"){$error{$line
+{date_string}} = $line{l_count};}
}
}
sub date_setup(){
%d_first = &return_data(@data[0]);
%d_last = &return_data(@data[$#data]);
print "First date: $d_first{month}/$d_first{day} $d_first{hour}:$d
+_first{min}\n";
print "Last date: $d_last{month}/$d_last{day} $d_last{hour}:$d_las
+t{min}\n";
}
sub date_hash(){
print "Accuracy is $accur\n";
my $l_min,$l_hr,$l_mon,$l_day;
my $t_min,$t_hr,$t_mon,$t_day;
$t_mon = sprintf("%.2d",$d_first{month});
$t_day = $d_first{day};
if ($mode eq "fd"){
$t_hr = 0;
$t_min = 0;
}
else{
$t_hr = $d_first{hour};
$t_min = $d_first{min};
}
$l_date_min = sprintf("%.2d", $l_date_min);
$l_date_hr = sprintf("%.2d", $l_date_hr);
$l_date_day = sprintf("%.2d", $l_date_day);
$l_date_month = sprintf("%.2d", $l_date_month);
while ($t_mon <= $d_last{month}){
while ($t_day <= $d_last{day} || ($t_mon < $d_last{month} && $
+t_day <= 31)){
while ($t_hr <= 23){
if ($accur eq "minute"){
while ($t_min <= 59){
unless ($t_day eq $d_last{day} && $t_hr > $d_las
+t{hour} && $mode ne "fd"){
unless ( ($t_min > $d_last{min} && $t_hr >= $d
+_last{hour}) && $mode ne "fd"){
#print "Add:" . sprintf("%.2d",$t_mon). "/
+" . sprintf("%.2d",$t_day) . " " . sprintf("%.2d",$t_hr) . ":" . spri
+ntf("%.2d",$t_min) . "\n";
$date_plots{sprintf("%.2d",$t_mon). "/" .
+sprintf("%.2d",$t_day) . " " . sprintf("%.2d",$t_hr) . ":" . sprintf(
+"%.2d",$t_min)}=0;
}
}
$t_min++;
}
$t_min = 0
}elsif($accur eq "hour"){
unless ($t_day eq $d_last{day} && $t_hr > $d_last{
+hour}){
$date_plots{sprintf("%.2d",$t_mon). "/" . spri
+ntf("%.2d",$t_day) . " " . sprintf("%.2d",$t_hr) . ":00"}=0;
}
}
$t_hr++;
$t_min = 0;
}
$t_hr = 0;
$t_day++;
}
$t_mon++;
$t_day = 1;
}
}
sub check_usage(){
if ($accur eq "" || $suffix eq ""){
print "Usage: perl WAC.pl [suffix] [hour minute]";
exit;
}
}
sub read_data(){
print "Reading...\n";
open(HANDLE,"./$suffix\_$accur.txt") || die $!;
@data = <HANDLE>;
close(HANDLE);
}
sub return_data(){
my $line = $_[0];
my $date;
my $return_hash;
#print "$line\n";
($l_date,$l_count,$l_msg) = split(/\t/,$line);
($l_date_a,$l_date_b,$date_c) = split(/ /,$l_date);
($l_date_month,$l_date_day,$extra_date) = split(/\//,$l_date_a);
($l_date_hr,$l_date_min,$extra_time) = split(/\:/,$l_date_b);
if ($l_date_hr eq ""){$l_date_hr = "00";}
if ($l_date_min eq ""){$l_date_min = "00";}
if ($date_c eq "PM" && $l_date_hr != 12){$l_date_hr += 12;}
$l_date_min = sprintf("%.2d", $l_date_min);
$l_date_hr = sprintf("%.2d", $l_date_hr);
$l_date_day = sprintf("%.2d", $l_date_day);
$l_date_month = sprintf("%.2d", $l_date_month);
$return_hash{l_count} = $l_count;
$return_hash{l_msg} = $l_msg;
$return_hash{month} = $l_date_month;
$return_hash{day} = $l_date_day;
$return_hash{hour} = $l_date_hr;
$return_hash{min} = $l_date_min;
$return_hash{date_string} = "$l_date_month/$l_date_day $l_date_hr:
+$l_date_min";
return %return_hash;
}
sub plot_graph(){
@data = (
\@plots_date,
\@plots_exception, #Red
\@plots_success, #Green
\@plots_wac, #Yellow
\@plots_error, #?
);
my $graph = GD::Graph::bars->new(1000,700);
$graph->set(
correct_width => 0,
x_label => 'Days',
y_label => 'WAC service response',
title => "WAC Service Call Results as of: $mon/$
+mday/$year $hour:$min:$sec",
t_margin => 10,
b_margin => 10,
l_margin => 10,
r_margin => 100,
#x_label_skip => sprintf("%.0d",$#plots_date / 12),
show_values => 0,
x_label_position => 0.50,
y_label_position => 0.50,
x_labels_vertical => 1,
y_long_ticks => 1,
#line_types => [1,1,1],
#skip_undef => 1,
boxclr => 'white',
fgclr => 'gray',
#bar_width => 1,
accent_treshold => 1,
#cumulate => 1,
#show_values => 1,
overwrite => 1,
axislabelclr => 'black',
dclrs => [ qw(red green blue orange) ]
) or die $graph->error;
$graph->set_text_clr('black');
if ($accur eq "hour"){
print $#plots_date;
if ($#plots_date == 24){$graph->set(x_label_skip=>1);}
elsif ($#plots_date <= 200){$graph->set(x_label_skip=>8);}
else{$graph->set(x_label_skip=>64);}
}
if ($accur eq "minute"){
$graph->set(x_label_skip=>$#plots_date/24);
}
$graph->set_legend(@plot_legend);
$graph->set_legend_font(GD::gdMediumBoldFont);
$graph->set_title_font(GD::gdMediumBoldFont);
my $gd = $graph->plot(\@data) or die $graph->error;
open(IMG, ">./$suffix\_$accur.png") or die $!;
binmode IMG;
print IMG $gd->png;
}
|