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

#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)
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

von progdoc (2220 Punkte)
- 20.08.2012 um 22:25 Uhr

#!/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
Seite 1 von 0
1