Array in HTML Tabelle ausgeben

Hallo,

vorweg, ich bin in Perl noch ein ziemlicher Anfänger.

ich habe eine CSV Datei die sich wie folgt splittet:

Jahr,Einnahmen,Ausgaben
1999,155000,200000
2000,188000,151000

Ich habe es schon geschafft die CSV Datei auszulesen und in ein Array zu speichern.

Das Array sieht demnach ungefähr so aus:

@data =
$res[01],$res[04],$res[07]
$res[02],$res[05],$res[08]
$res[03],$res[06],$res[09]

Wie schaffe ich es jetzt dieses Array in einer HTML Tabelle wiederzugeben? Müsste ich für Jahr, Einnahmen und Ausgaben jeweils ein Extra Array erstellen?

Vielleicht steh ich einfach auf dem Schlauch.

Danke schonmal im Vorraus

Gruß

Frank

Hallo,

ich habe eine CSV Datei die sich wie folgt splittet:

Jahr,Einnahmen,Ausgaben
1999,155000,200000
2000,188000,151000

Ich habe es schon geschafft die CSV Datei auszulesen und in
ein Array zu speichern.

Das Array sieht demnach ungefähr so aus:

@data =
$res[01],$res[04],$res[07]
$res[02],$res[05],$res[08]
$res[03],$res[06],$res[09]

Das ist schlecht, weil das nicht die Struktur der Daten wiederspiegelt.
Besser ist es, für jede Zeile in der CSV-Datei ein eigenes Array zu speichern:

my @data;
while (){
 chomp;
 my @row = split /;/, $\_;
 push @data, \@row; # das \ sorgt dafür, dass
 # eine Array-Referenz in @data landet.
}

Wenn du das hast, kannst du bequem zeilenweise über das Array iterieren:

for my $row (@data){
 print "";
 print map {"$\_" } @$row;
 print "\n";
}

Mehr zum Thema verschachtelte Datenstrukturen gibts hier:
http://perldoc.perl.org/perlreftut.html

Grüße,
Moritz

Ich habe es schon geschafft die CSV Datei auszulesen und in
ein Array zu speichern.

dafür hast du hoffentlich Text::CSV oder Text::CSV_XS verwendet.

Das Array sieht demnach ungefähr so aus:

@data =
$res[01],$res[04],$res[07]
$res[02],$res[05],$res[08]
$res[03],$res[06],$res[09]

du hast 2 arrays? @res und @data? wozu?
im übrigen hast du ja zeilen mit werten, und sowas
speichert man üblicherweise in einem array of arrays.
also pro zeile:

push @data, \@fields; # @fields sind die nach komma gesplitteten werte

Wie schaffe ich es jetzt dieses Array in einer HTML Tabelle
wiederzugeben? Müsste ich für Jahr, Einnahmen und Ausgaben
jeweils ein Extra Array erstellen?

wenn du tatsächlich ein array of arrays hast, dann geht das einfach:

use HTML::Template::Compiled;
my $htc = HTML::Template::Compiled-\>new(
 filename =\> 'template.html',
 plugin =\> [qw/ ::HTML\_Tags /],
);
$htc-\>param(data =\> [
 [qw/ Jahr Einnahmen Ausgaben /],
 @data
]);

im template:

du könntest auch die html-funktionen von CGI.pm dafür verwenden. oder zu fuss:

my $table = qq{

} . (map {
qq{} . (map „$_“ @$_) . qq{}
} @data) . qq{;

(alles ungetestet)

edit: vertippt

Danke euch beiden. Ich denke das hilft mir weiter :smile:

Leider hab ichs immer noch nicht ganz geschafft. Der Code hat sich auch wieder ein wenig verändert.

Ausgelesen wird dir CSV Datei und auch als Tabelle dargestellt. Das einzige Problem ist, das die erste Zeile der CSV Datei nicht mitgelesen wird.

Kann mir jemand von euch vielleicht einen Tip geben?

Hier der Code:

#!f:/Perl/bin/perl -w
print’

';

use strict;
use DBI;

my$DBH;
my$STH;

##Datenbankverbindung##

$DBH = DBI->connect(„DBI:CSV:daten=f:/apache/cgi-bin“)
or die „Konnte keine Verbindung zur Datenbank herstellen!$!\n“;

$STH = $DBH->prepare(„SELECT * FROM daten“)
or die „Konnte SQL Statement nicht Bereitstellen!$!\n“;

$STH->execute()
or die „Ausführen nicht möglich!$!\n“;

my @data;

my $csv = new Text::CSV_XS;
open(FILE,„daten“) || die „Datei nicht vorhanden“;
while (my $line = ) {
$csv->parse($line);
my @row = $csv->fields;
push(@data,@row);
}

print ‚‘;

while (my @row = $STH->fetchrow_array())
{

print ‚‘.$row[0].’’.$row[1].’’.$row[2].’’."\n";
}
print ‚‘."\n";

$STH->finish();
$DBH->disconnect;
print ’

';

CODE ENDE

Kann mir jemand von euch vielleicht einen Tip geben?

erstmal fände ich es interessant zu wissen, wieso du DBD::CSV und gleichzeitig
Text::CSV_XS benutzt. man nimmt entweder das eine oder das andere.

Hier der Code:

bitte in zukunft pre-Tags um deinen code herumschreiben:

http://www.wer-weiss-was.de/app/faqs/classic?entries…

dann…

CODE ENDE

brauchst du auch sowas nicht mehr.

warum die erste zeile nicht gelesen wird, kann ich dir auch nicht sagen,
aber vorher solltest du dich auf ein modul festlegen und es dann nochmal
probieren.

Leider hab ichs immer noch nicht ganz geschafft. Der Code hat
sich auch wieder ein wenig verändert.

Ausgelesen wird dir CSV Datei und auch als Tabelle
dargestellt. Das einzige Problem ist, das die erste Zeile der
CSV Datei nicht mitgelesen wird.

Kann mir jemand von euch vielleicht einen Tip geben?

Klaro :smile:

Das bei dir die erste Zeile nicht gelesen wird, kann ich mir auch nicht so richtig erklären. Fehlt da vielleicht irgendwo ein Trenner oder hat es ein komisches Zeilenende? oder sind da Sonderzeichen im Spiel?

Ich hab mir auch dienen Code angesehen und würde auf den DBI-Kram verzichten. Ich würde das nur in Erwägung ziehen, wenn ich auf bestimmte Daten in der CSV Datei zugreifen will.

So sähe das in etwa aus wenn ich das machen würde:

# CPAN Module
use Text::CSV\_XS;
use IO::Handle;

# Dateiname (evtl. noch eine Pfadangabe hinzufuegen
my $file = 'text.csv';

# File oeffnen
open(my $io, $file) or die "Can't open $file: $!";

# CSV\_XS Objekt erstellen
# hier noch den Attribut Hash anpassen
my $csv = Text::CSV\_XS-\>new({sep\_char =\> ";",
 binary =\> 1,
 eol =\> \$;
 });

# Datei zeilenweise durchgehen
# parsen und als Tabelle ausgeben
while ($io) {

 my $row = $csv-\>getline($io);

 print ''.$row-\>[0].''.$row-\>[1].''.$row-\>[2].''."\n";

 last if $io-\>eof();
} 

Hoffe das hat geholfen!

Viel Spaß noch beim weiteren perlen :smile:
Fini

1 Like