#Perl to make HTML bar graph out of milage table
open(INFILE, "< DadGas.txt") or die "Can not open DadGas.txt $!";
# This program gets the date from the 1st column,
# gets the mileage from the 5th column,
# and ignores everything else.
$do_html = 1;
$graph_width = 730;
$target_bar_width = 4;
$reasonable_min = 30;
$reasonable_max = 60;
$pix_for_rmin = 20;
$pix_for_rmax = 200;
$span_o_reason = $reasonable_max - $reasonable_min;
$pix_r_span = $pix_for_rmax - $pix_for_rmin;
$pix_per_mpg = $pix_r_span/$span_o_reason;
$max_samples_per_row = 0;
$life_miles = 0;
$life_gas = 0;
$num_years = 0;
$min_mileage = 999;
$max_mileage = 0;
$total_num_samples = 0;
$last_year = '';
while ($inline = <INFILE>) {
$date = $total_miles = $gas = $miles = $mileage = '';
($date,$total_miles,$gas,$miles,$mileage) =
($inline =~ m/(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)/);
$mileage = $mileage + 0;
unless ($inline =~ m/test/i) {
$life_miles = $life_miles + $miles;
$life_gas = $life_gas + $gas;
}
($year,$month,$day) = ($date =~ m|(\w\w\w\w)-(\d\d)-(\d\d)|);
if ($year ne $last_year and $last_year) {
$annuals{$total_num_samples} = $last_year;
}
$last_year = $year;
$last_month = $month;
unless ($inline =~ m/test/i) {
if ($reasonable_min<$mileage and $mileage<$reasonable_max) {
$min_mileage = $mileage if $mileage<$min_mileage;
$max_mileage = $mileage if $mileage>$max_mileage;
$total_num_samples++;
push @mileages,$mileage;
#print "pushed $mileages[$total_num_samples-1] at ",$total_num_samples-1,"\n";
}
}
}
$annuals{$total_num_samples} = $last_year;
#print "total_num_samples = $total_num_samples\n";
if ($do_html) {
print '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',"\n";
print '<html><head><title>Mileage Graph</title></head>',"\n";
print '<body bgcolor="E0E0E0">',"\n";
print '<table border="5" bordercolor="c0c0c0" rules="none"';
print ' cellpadding="0" cellspacing="0">',"\n";
}
$max_samples_per_row = int($graph_width/$target_bar_width);
#print "max_samples_per_row=$max_samples_per_row\n";
#print "\n";
$first_sample_of_row = 0;
$last_sample_of_row = 0;
$all_done = 0;
while (not $all_done) {
$num_samples_this_row = 0;
$num_samples = 0;
$done = 0;
while (not $done) {
if ($annuals{$num_samples + $first_sample_of_row}) {
#print "annuals ",$num_samples + $first_sample_of_row," = $annuals{$num_samples + $first_sample_of_row} \n";
$num_samples_this_row = $num_samples;
}
$num_samples = $num_samples + 1;
if ($num_samples >= $max_samples_per_row) {
$done = 1;
}
if ($num_samples + $first_sample_of_row >= $total_num_samples) {
$num_samples_this_row = $num_samples;
$done = 1;
$all_done = 1;
}
}
#print "\n";
$last_sample_of_row = $first_sample_of_row + $num_samples_this_row-1;
#print "$num_samples_this_row samples in this row, last is ",$mileages[$last_sample_of_row],"\n";
$width = $target_bar_width;
#print "This row is from $first_sample_of_row to $last_sample_of_row\n";
$max_samples_per_row = $num_samples_this_row if $max_samples_per_row < $num_samples_this_row;
if ($do_html) {
#Start row
print '<tr>',"\n";
#Do 30, 40, 50 scale at left of bars
print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:24pt">',"\n";
print '<u>mpg</u><br>50-<br>-<br>-<br>40-<br>-<br>-<br>30-<br>-<br></td>',"\n";
print '<td valign="bottom"><img width="',$width,'" height="28" src="blu8x8.gif" alt="30.01"></td>',"\n";
print '<td valign="bottom"><img width="',$width,'" height="88" src="blu8x8.gif" alt="40.00"></td>',"\n";
print '<td valign="bottom"><img width="',$width,'" height="148" src="blu8x8.gif" alt="50.00"></td>',"\n";
}
foreach $sample_num ($first_sample_of_row..$last_sample_of_row) {
$mileage = $mileages[$sample_num];
if ($annuals{$sample_num} or $sample_num == 0) {
if ($do_html) {
print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:1pt">',"\n";
print '-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br></td>',"\n";
}
}
#print "Graphing sample $sample_num which is $mileage\n";
$height = int(
($mileage*$pix_per_mpg)
-($reasonable_min*$pix_per_mpg)
+$pix_for_rmin #intended offset
+8 #trial and error value to get dashs to line up
+0.5);
$mileage = sprintf("%2.2f",$mileage);
if ($do_html) {
print '<td valign="bottom"><img width="',$width,'" height="',$height,'" src="blu8x8.gif" alt="',$mileage,'"></td>',"\n";
}
}
if ($do_html) {
#End row
print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:1pt">',"\n";
print '-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br></td>',"\n";
print '</tr>',"\n";
}
print '<tr>',"\n";
print '<td></td>',"\n";
print '<td align="center" colspan="3"></td>',"\n";
$last_col = 0;
foreach $sample_num ($first_sample_of_row..$last_sample_of_row+1) {
if ($annuals{$sample_num}) {
print '<td></td>',"\n";
$this_span = $sample_num - $first_sample_of_row - $last_col;
$last_col = $sample_num - $first_sample_of_row;
if ($this_span*$width > 30) {
print '<td align="center" colspan="',$this_span,'">',$annuals{$sample_num},'</td>',"\n";
} else {
print '<td align="center" colspan="',$this_span,'"></td>',"\n";
}
}
}
print '</tr>',"\n";
$first_sample_of_row = $last_sample_of_row + 1;
#print "\n";
}
#End frame
$life_mpg = $life_miles/$life_gas;
$life_mpg = 0.1*int(10*$life_mpg + 0.5);
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'">Life: ',$life_mpg,' MPG</td>',"\n";
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'"><small>To see the actual data, hold your pointer over the bars.</small></td>',"\n";
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'"><small>(The left 3 bars are just for checking the vertical scale.',"\n";
print 'They should line up with the 30, 40, and 50mpg tick marks.)</small></td>',"\n";
print '</table></body></html>',"\n";
__END__