Seite 1 von 1
Datenbank Export-Konverter
Verfasst: Mittwoch 20. Juli 2005, 22:44
von brasil66
Hallo!
Ich bin "genötigt" für ein Projekt hier bei uns einen Export-Konverter zu basteln und würde das gerne mit Python erledigen. Unser studentischer Code-Hacker ist z.Zt. leider im Urlaub(und der Strippenzieher und Telefonanlagenmensch(ich) hat es jetzt am Hals) .....
Folgendes Problem:
Wir exportieren aus unserer DB eine Semikolon-getrennte ASCII-Datei im Format:
"drgddrshd";"dfhjdllydlh";"döfkhldlsglsghs";"dkfhjldgldyhgle"
Wobei jede Zeile genau einem Datensatz entspricht.
Die exportierten Felder müssen jetzt in Felder mit definierter Länge ohne Trennung konvertiert werden.
Das Grundkonzept steht bereits soweit, was mir aber noch ein wenig Kopfzerbrechen bereitet ist das Parsen der Felder, also wie bekomme ich das erste Feld "dummytext" eingelesen, kann dieses weiterverarbeiten und gehe dann nach dem ; zu nächsten Feld über usw.
Vieleicht hat ja jemand schon so etwas mal umgesetzt und könnte mich auf den richtigen Weg bringen .......
Schonmal 10000 Dank im voraus!!!
Verfasst: Donnerstag 21. Juli 2005, 06:25
von jens
Entweder zu benutzt
RE oder arbeitest mit
split().
z.B. (ungetestet!):
Code: Alles auswählen
import re
f = file( "DBdump", "r")
c = f.read()
f.close()
print re.findall( r'"(.*?)"', c )
print "-"*80
print [i[1:-1] for i in c.split(";")]
Verfasst: Donnerstag 21. Juli 2005, 18:15
von jgollers
jens hat geschrieben:Entweder zu benutzt
RE oder arbeitest mit
split().
... oder man könnte es auch mit dem
CSV-Modul versuchen.
Ein Beispiel aus der Python-Doku:
Code: Alles auswählen
import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
print row
und hier noch eins
Code: Alles auswählen
import csv
reader = csv.reader(open("some.csv", "rb"))
for row in reader:
print row[0], row[1], row[2], row[3]
Allerdings ist das Trennzeichen beim CSV-Modul (delimiter) standardmäßig das Komma. Dies müßte also noch geändert werden.
Jörg Gollers
Edit (Leonidas): Code in Python-Tags gesetzt.
Verfasst: Donnerstag 21. Juli 2005, 19:08
von brasil66
yep, das hilft mir ersteinmal ein großen schritt weiter.danke dafür!
vor allem der tipp mit dem csv-modul war prima, aber wie schließe ich aus das genau das delimiter-zeichen, wenn es in einem der felder vorkommt, nicht falsch erkannt wird und mir damit die ganze ausleserei durcheiander gerät? ein komma oder semikolon kann bei den daten durchaus schonmal dazwischen rutschen .........
Verfasst: Donnerstag 21. Juli 2005, 22:32
von BlackJack
Ein Trennzeichen innerhalb eines Datenfeldes steht doch auch innerhalb der Anführungszeichen, also z.B.
"blah";"blub;xyz";"spam"
Das liest das `cvs`-Modul als 3 Datenfelder ein wobei das zweite halt auch ein Semikolon enthält.
Verfasst: Freitag 22. Juli 2005, 07:49
von Mawilo
... und hier noch ein Beispiel mit Angabe des delimiter-Zeichen
Code: Alles auswählen
import csv
reader = csv.reader(file('some.csv', 'rb'),delimiter=';')
for row in reader:
print row
Stephan
Verfasst: Montag 25. Juli 2005, 22:30
von brasil66
Danke erstmal für die Tipps, haben mir viel geholfen!
Jetzt habe ich aber noch ein kleines Problemchen. Ich bin bisher davon ausgegangen, das ich die Stringformatierungsfunktionen ljust, rjust und zfill auch zur Umformatierung der Strings verwenden könnte, so in der Art:
datensatz_neu[x] = datensatz_alt[x].rjust(20)
Aber anscheinend sind diese lediglich für die formatierte Ausgabe zu benutzen. Wie bekomme ich es nun hin, das ich einen neuen String erhalte, der den nach meinen Wünschen umformatierten alten String erhält. Die Funktionalitäten von rjust, ljust und zfill reichen mir da völlig aus.
Habe ich etwas prinzipielles nicht verstanden oder mache ich einfach nur einen Denkfehler?
Verfasst: Dienstag 26. Juli 2005, 00:37
von Joghurt
Das geht ähnlich wie (s)printf:
Verfasst: Dienstag 26. Juli 2005, 23:47
von BlackJack
brasil66 hat geschrieben:Jetzt habe ich aber noch ein kleines Problemchen. Ich bin bisher davon ausgegangen, das ich die Stringformatierungsfunktionen ljust, rjust und zfill auch zur Umformatierung der Strings verwenden könnte, so in der Art:
datensatz_neu[x] = datensatz_alt[x].rjust(20)
[...]
Habe ich etwas prinzipielles nicht verstanden oder mache ich einfach nur einen Denkfehler?
Irgendwo muss ein Fehler sein, die Methoden funktionieren natürlich unabhängig davon was man mit der Zeichenkette danach anstellt.
Code: Alles auswählen
In [20]: alt = 'blah'
In [21]: neu = alt.rjust(10)
In [22]: neu
Out[22]: ' blah'
Verfasst: Donnerstag 4. August 2005, 17:21
von brasil66
danke für die diesbezügliche hilfe. meine fragen hierzu können als beantwortet angesehen werden!
DANKE!