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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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

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

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

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: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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

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

Das geht ähnlich wie (s)printf:

Code: Alles auswählen

formatted = "%-20s%-20s%-20s" %(str1,str2,str3)
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'
brasil66
User
Beiträge: 27
Registriert: Mittwoch 20. Juli 2005, 19:01
Wohnort: Braunschweig

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

DANKE!
Antworten