Monday, June 25, 2007

Arbeiten mit CSV-Dateien

Im Forum von Perl-Community.de tauchen relativ häufig Fragen in Verbindung mit CSV-Dateien auf. Die meisten wollen das CSV-Format selbst parsen und dann recht umständlich die benötigten Informationen heraussuchen. Ich selbst überlasse so etwas ganz gerne Modulen von CPAN. Mein "Lieblingsmodul" zum Thema CSV ist DBD::CSV. Damit kann man mit CSV-Dateien umgehen wie mit "normalen" Datenbanken - und kann die altbekannte API von DBI verwenden.

Hier mal ein kleines Beispiel:

Die CSV-Datei "konferenzen":
KonfID;KonfName;Monat
1;Perl-Workshop;Februar
2;YAPC::Europe;August
3;FrOSCon;August
4;"Linux-Tage Essen";November


Das Perl-Skript:
#!/usr/bin/perl

use strict;
use warnings;
use DBI;

use Data::Dumper;

#Ordner, in dem die CSV-Datei liegt
my $dir = '.';

#Trennzeichen in der Datei (hier: das Semikolon)
my $sep = ';';

#Verwende DBI mit DBD::CSV damit mit den
#CSV-Dateien gearbeitet werden kann
my $dsn = "DBI:CSV:csv_sep_char=\\".$sep;

my $dbh = DBI->connect( $dsn,"","" ) or die $DBI::errstr;
$dbh->{'RaiseError'} = 1;

#SQL-Statement
my $select = qq~SELECT KonfName
FROM konferenzen
WHERE Monat = ?~;

my $gesuchter_monat = 'August';

# Abfrage ausfuehren
my $sth = $dbh->prepare( $select ) or die $dbh->errstr;
$sth->execute( $gesuchter_monat ) or die $dbh->errstr;

# Ausgabe Ergebnis
print "Konferenzen im $gesuchter_monat:\n";
while( my ($conf) = $sth->fetchrow_array ){
print "\t",$conf,"\n";
}


Dann bekommt man als Ausgabe:
C:\>csv_beispiel.pl
Konferenzen im August:
YAPC::Europe
FrOSCon

2 comments:

||Best|Picture|Point|| said...

wozu deklarierst du:

my $dir = '.';

wenn es dann nicht verwendet wird?

TIA - k.

ReneeB said...

Danke für den Hinweis. Das ist noch ein Überrest von einer "älteren" Version des Skripts...

Die Deklaration kann natürlich weggelassen werden!