On Tue, June 25, 2013 21:37, Sebastian Reinhardt wrote:
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
Falls es mit den mdb-tools nicht klappen sollte, würde ich mir ja mal den RapidMiner anschauen. Der kann Access Datenbanken lesen und entweder in csv wandeln oder gleich in eine Datenbank dumpen. Viele Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org