Perl :: Aufgabe #9 :: Lösung #1

2 Lösungen Lösungen öffentlich
#9

CSV-Datei auslesen und aus den Daten eine Tabelle und ein Diagramm erzeugen (CGI)

Fortgeschrittener - Perl von Gustl - 16.08.2012 um 10:36 Uhr
Erstellen Sie ein Perl- Skript, das die angehängte CSV- Datei (EUR/USD Dollarkurs von einem Jahr) in ein Array einliest. Diese eingelesenen Werte sollen in einer Tabelle dargestellt werden und sich in einem Linien-, Punkt- oder Balkendiagramm widerspiegeln.

In dem Diagramm soll nur jeder vierte Wert ausgegeben werden.
Das Datum soll in folgendes Format konvertiert werden: DD.MM.YY (16.08.12)


#1
vote_ok
von progdoc (2220 Punkte) - 20.08.2012 um 22:25 Uhr
Quellcode ausblenden Perl-Code
#!/usr/bin/perl 
use strict ;
use warnings ;
use GD::Graph::lines ;
#I first downloaded the data file
open ( FH , "<" , "dataset.txt" )
   or die "Can't open the data file!\n" ;
my @dataset ;
while ( <FH> ) {
   chomp ;
   next unless $_ =~ /\d+/ ; #don't read in the column headers
   my @data = split ( ";" , $_ ) ;
   for my $i ( 0..$#data ) {
      push ( @{$dataset[ $i ]} , $data[ $i ] ) ;
   }
}
close( FH ) ;
#we now want to reverse the data sets to reflect the chronological order
for my $i ( 0..$#dataset ) {
   my @reversed = reverse @{$dataset[ $i ]} ;
   @{$dataset[ $i ]} = @reversed ;
}
#convert the data values into the desired format
@{$dataset[ 0 ] } =  map { my ( $year , $month , $day ) = split ( /-/ , $_ ) ;
   join ( "." , $day , $month , substr ( $year , -2 ) ) } @{$dataset[ 0 ] } ;
#convert the data into numbers with a decimal point
for my $i ( 1..4 ) {
   map { $_ =~ s/,/\./ } @{$dataset[ $i ] } ;
}
#for the y axis numbering, find the smallest and the greatest data value
my $datapointnumber = @{$dataset[ 0 ] } ;
my $graph = GD::Graph::lines->new( 1600 , 400 ) ;
$graph->set( 
      x_label            => "Datum" ,
      y_label            => "Kurse( Start , höchster, tiefster, Schluss )" ,
      title              => "Kursentwicklung des Euro zum Dollar von 2011 bis 2012" ,
      y_tick_number      => 5 ,
      y_number_format    => \&y_format ,
      x_label_skip       => 4 ,
      x_labels_vertical  => 1 ,
      transparent        => 0 , 
) ;
$graph->set_legend( "Startkurs" , "Hoechstkurs" , "Tiefstkurs" , "Abschlusskurs" ) ;
my $gd = $graph->plot( \@dataset ) or die $graph->error ;
open ( IMG , '>exchange.png' ) or die $! ;
binmode IMG ;
print IMG $gd->png ;
close IMG ;

sub y_format {
   my $value = shift ;
   $value =~ s/\./,/ ;
   return  $value . "0" . " \$" ;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben