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

Datenbank Export-Konverter

Beitragvon brasil66 » 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » 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
Benutzeravatar
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

Beitragvon jgollers » 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

Beitragvon brasil66 » 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

Beitragvon 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:

Beitragvon Mawilo » 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

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

Beitragvon Joghurt » Dienstag 26. Juli 2005, 00:37

Das geht ähnlich wie (s)printf:

Code: Alles auswählen

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

Beitragvon 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

Beitragvon brasil66 » Donnerstag 4. August 2005, 17:21

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

DANKE!

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider], onkelhamu