Hallo,
Kann mir jemand einen Tipp geben, welche Möglichkeiten zum Auslesen von
mdb- Dateien in Perl- Skripten in Linux existieren?
Bisher habe ich aus dem Perl-Script die "mdb-tools" aufgerufen- Da
funktioniert ganz gut, hat aber den Nachteil, dass das Verarbeiten der
Datei mit mehr als 500000 Zeilen schon mal auf einem besseren Rechner
(2x 6CPU-Cores, 16GB RAM usw.) schon mal 4 Tage dauern. Das ist mir
einfach zu lange.
Nun habe ich mich daran gemacht das auf DBD::ODBC umzustellen. Als
Treiber verwende ich die libmdbodbc des MDB-Tools- Projektes. Leider
habe ich so meine Probleme. So ist es mir bisher nicht gelungen, die
mdb- Datei im Script zu übergeben. Nur wenn ich in die Benutzer-
odbc.ini die Datei und Treiber angebe, gelingt die Verbindung. Des
weiteren habe ich Probleme den Tabellenkopf der gewählten Tabelle
auszulesen. Wenn ich das mit den mdb-tools auf Komandozeiel mache, dann
geht das.
Ergebnis des Kopfes mit mdb-sql:
|PARTNO |OLDPARTNO |DESCRIPTION |PRICE |PRICE_PER |PACKAGING
|MAIN_SUBGROUP|KATALOG |PAGE |
Wenn ich das gleiche mit DBD::ODBC (print "Field names: @{ $sth->{NAME}
}\n";) versuche bekomme ich das:
Field names: PODPPPMKP ODPPPMKP DPPPMKP PPPMKP PPMKP PMKP MKP KP P
Da ich die ganze Tabelle nat. aufgrund er Größe nicht mit einmal
komplett auslesen kann, lese ich erstmal die Artikelnummern (es handelt
sich ja um eine Preisliste) und dann lese ich die jeweiligen Datensätze
anhand der Nummer. Obwohl es mir nicht gelingt, den Tabellenkopf korrekt
auszulesen, gelingt das Auslesen einer Artikelnummernspalte mit:
---------------
my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist));
$sth->execute();
---------------
Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile
auszulesen, dann kommt nichts:
---------------
foreach(@part_no)
{
my $tmp_var = $_;
my $stmt = "SELECT * FROM Pricelist WHERE 'partno' =
'$tmp_var'";
$sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE
'PARTNO' = '$tmp_var'));
$sth->execute();
print "Partno:".$_."=>";
while(my $row = $sth->fetchrow_array())
{
foreach (@$row) { $_ = '' unless defined }
print "@$row\n";
}
$sth->finish();
print "\n";
}
-------------
Es kommt nur:
-------------
Partno:0000000015=>
Partno:0000021550=>
Partno:0000028600KR=>
Partno:0000028610KR=>
Partno:0000028660KR=>
Partno:0000030520=>
Partno:0000030530=>
Partno:0000030574=>
Partno:0000076330=>
Partno:0000085120=>
Partno:0000085140=>
Partno:0000085150=>
Partno:0000085230=>
Partno:0000085240=>
Partno:0000085340=>
Partno:0000085430=>
Partno:0000085430KR=>
Partno:0000085450=>
Partno:0000085500=>
........
-------------
Füttere ich nun die gleichen Artikelnummern in "mdb-sql", dann kommen
die Daten problemlos raus.
Die Frage ist nun, mache ich was falsch oder ist der Treiber von
libmdbodbc das Problem? Gibt es irgendwo eine ordentliche Doku? Gibt es
event. einen anderen Treiber/ PERL-Modul, um die mdb's auszulesen?
OS: openSUSE 12.3 (x86_64)
mdb-tools: mdbtools-0.6pre1-34.1.2.x86_64
--
Mit freundlichen Grüßen
Sebastian Reinhardt
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe(a)opensuse.org
Um den Listen Administrator zu erreichen, schicken
Sie eine Mail an: opensuse-de+owner(a)opensuse.org