afarber

parse CSV to Google charts

May 31st, 2013
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.74 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use JSON;
  5. use File::Basename;
  6. use Data::Dumper;
  7.  
  8. sub print_html_header($);
  9. sub print_chart_divs($);
  10. sub print_html_footer();
  11.  
  12. # How to add to a Hudson job
  13. # C:\QBSanity\SanityConsole.exe QBSanityRunner
  14. # md workspace\csv
  15. # C:\PETools\RLXParser\RLXParserConsole.exe workspace\TestStandLogs workspace\csv --resultflag=ALL --targetppk=1.33 --calcstats
  16. # perl c:\Perl\rest.pl "workspace\csv\EDGE_*_DACAL_PMEAS_*.csv" > workspace\report\EDGE_CAL.html
  17. # perl c:\Perl\rest.pl "workspace\csv\GSM_*_DACAL_PMEAS_*.csv" > workspace\report\GSM_CAL.html
  18. # After that add GSM_CAL.html,EDGE_CAL.html to HTMLReport
  19.  
  20. my $data = {};
  21.  
  22. my $dataSeen = 0;
  23.  
  24. # ensure the script has been called with 1 argument
  25. if (@ARGV != 1 || $ARGV[0] !~ /\.csv$/i) {
  26.         print STDERR qq{Usage: $0 "/path/*.csv"\n};
  27.         exit 1;
  28. }
  29.  
  30. # filenames end with ".csv", but do not contain "txv3"
  31. @ARGV = grep /\.csv$/i && !/txv3/i, glob($ARGV[0]);
  32.  
  33. while (<>) {
  34.         my $csv = basename($ARGV, '.csv');
  35.  
  36.         if (eof) {
  37.                 printf STDERR "Generated chart: %s\n", $csv;
  38.                 $dataSeen = 0;
  39.         }
  40.  
  41.         s/[\r\n]//g;
  42.         my @sp = split /,/;
  43.         next unless @sp > 9;
  44.         my $key = $sp[0];
  45.         next unless $key =~ /^(MEASUREMENT:|LSL:|USL:|\d+)$/;
  46.         $key =~ tr/://d;
  47.         next if ($key eq 'LSL' && !$dataSeen);
  48.         next if ($key eq 'USL' && !$dataSeen);
  49.         my @cut = splice(@sp, 0, 9);
  50.  
  51.         $data->{$csv} = { cols => [], rows => [] } unless $data->{$csv};
  52.         my $obj = $data->{$csv};
  53.  
  54.         # the values for the x-axis
  55.         if ($key eq 'MEASUREMENT') {
  56.                 push @{$obj->{cols}}, {label => $key, type => 'string', p => {role => 'domain'}};
  57.  
  58.                 for (my $i = 0; $i < @sp; $i++) {
  59.                         $obj->{rows}->[$i] = { c => [] } unless $obj->{rows}->[$i];
  60.                         my $row = $obj->{rows}->[$i];
  61.                         my $val = $sp[$i];
  62.                         push @{$row->{c}}, {v => $val};
  63.                 }
  64.         } elsif ($key eq 'LSL') {
  65.                 push @{$obj->{cols}}, {label => $key, type => 'number', p => {role => 'interval'}};
  66.  
  67.                 for (my $i = 0; $i < @sp; $i++) {
  68.                         $obj->{rows}->[$i] = { c => [] } unless $obj->{rows}->[$i];
  69.                         my $row = $obj->{rows}->[$i];
  70.                         my $val = 1 * $sp[$i];
  71.                         push @{$row->{c}}, {v => $val};
  72.                 }
  73.         } elsif ($key eq 'USL') {
  74.                 push @{$obj->{cols}}, {label => $key, type => 'number', p => {role => 'interval'}};
  75.  
  76.                 for (my $i = 0; $i < @sp; $i++) {
  77.                         $obj->{rows}->[$i] = { c => [] } unless $obj->{rows}->[$i];
  78.                         my $row = $obj->{rows}->[$i];
  79.                         my $val = 1 * $sp[$i];
  80.                         push @{$row->{c}}, {v => $val};
  81.                 }
  82.         # the values for the y-axis
  83.         } else {
  84.                 $dataSeen = 1;
  85.                 $obj->{FAIL} = 1 if $cut[6] =~ /Failed/i;
  86.  
  87.                 push @{$obj->{cols}}, {label => $key, type => 'number', p => {role => 'data'}};
  88.  
  89.                 for (my $i = 0; $i < @sp; $i++) {
  90.                         $obj->{rows}->[$i] = { c => [] } unless $obj->{rows}->[$i];
  91.                         my $row = $obj->{rows}->[$i];
  92.                         my $val = 1 * $sp[$i];
  93.                         $val = undef if ($val == -32768 || $val == 32767 || $val == 65535);
  94.                         push @{$row->{c}}, {v => $val};
  95.                 }
  96.         }
  97. }
  98.  
  99. print STDERR Dumper($data);
  100.  
  101. print_html_header($data);
  102. print_chart_divs($data);
  103. print_html_footer();
  104.  
  105. sub print_html_header($) {
  106.         my $href = shift;
  107.  
  108.         printf <<EOF, encode_json($href);
  109. <!DOCTYPE HTML>
  110. <html>
  111. <head>
  112. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  113. <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1','packages':['corechart']}]}"></script>
  114. <script type="text/javascript">
  115.  
  116.         var data = %s;
  117.  
  118.         function drawCharts() {
  119.                 for (var csv in data) {
  120.                         var x = new google.visualization.DataTable(data[csv]);
  121.  
  122.                         var options = {
  123.                                 title: csv,
  124.                                 width: 800,
  125.                                 height: 600
  126.                         };
  127.  
  128.                         var chart = new google.visualization.LineChart(document.getElementById(csv));
  129.                         chart.draw(x, options);
  130.                 }
  131.         }
  132.  
  133.         \$(function() {
  134.                 google.setOnLoadCallback(drawCharts);
  135.         });
  136.  
  137. </script>
  138. <style type="text/css">
  139.         span.fail {
  140.                 color: #FFFFFF;
  141.                 background-color: #FF0000;
  142.                 padding: 2px 2px 2px 2px;
  143.         }
  144. </style>
  145. </head>
  146. <body>
  147. <p><a name="top">CONTENTS:</a></p>
  148. EOF
  149.  
  150.         for my $csv (sort keys %$href) {
  151.                 my $result = (exists $href->{$csv}->{FAIL} ? ' <span class="fail">FAIL</span>' : '');
  152.  
  153.                 printf qq{<a href="#%s">%s</a>%s<br>\n}, $csv, $csv, $result;
  154.         }
  155.  
  156.         print '<hr>';
  157. }
  158.  
  159. sub print_chart_divs($) {
  160.         my $href = shift;
  161.  
  162.         for my $csv (sort keys %$href) {
  163.                 my $result = (exists $href->{$csv}->{FAIL} ? ' <span class="fail">FAIL</span>' : '');
  164.                 printf qq{<a name="%s" href="#top">%s</a>%s\n}, $csv, $csv, $result;
  165.  
  166.                 printf qq{<div id="%s"></div>\n}, $csv;
  167.  
  168.                 print "<hr>\n";
  169.         }
  170. }
  171.  
  172. sub print_html_footer() {
  173.         print <<EOF;
  174. </body>
  175. </html>
  176. EOF
  177. }
Add Comment
Please, Sign In to add comment