Datenbank Export-Konverter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
brasil66
User
Beiträge: 27
Registriert: Mittwoch 20. Juli 2005, 19:01
Wohnort: Braunschweig

Mittwoch 20. Juli 2005, 22:44

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) ..... :lol: :evil:

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!!!
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 21. Juli 2005, 06:25

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(";")]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Donnerstag 21. Juli 2005, 18:15

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.
brasil66
User
Beiträge: 27
Registriert: Mittwoch 20. Juli 2005, 19:01
Wohnort: Braunschweig

Donnerstag 21. Juli 2005, 19:08

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 .........
BlackJack

Donnerstag 21. Juli 2005, 22:32

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.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Freitag 22. Juli 2005, 07:49

... 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
brasil66
User
Beiträge: 27
Registriert: Mittwoch 20. Juli 2005, 19:01
Wohnort: Braunschweig

Montag 25. Juli 2005, 22:30

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?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Dienstag 26. Juli 2005, 00:37

Das geht ähnlich wie (s)printf:

Code: Alles auswählen

formatted = "%-20s%-20s%-20s" %(str1,str2,str3)
BlackJack

Dienstag 26. Juli 2005, 23:47

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'
brasil66
User
Beiträge: 27
Registriert: Mittwoch 20. Juli 2005, 19:01
Wohnort: Braunschweig

Donnerstag 4. August 2005, 17:21

danke für die diesbezügliche hilfe. meine fragen hierzu können als beantwortet angesehen werden!

DANKE!
Antworten