Split Funktion mit Ausnahmen?

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
Patrick_S
User
Beiträge: 5
Registriert: Dienstag 17. Februar 2009, 17:11

Hallo zusammen,

ich bin neu hier - habe jedoch schon einige Zeit mit Python gespielt und hier viel mitgelesen.
zu meinem Problem hab ich bis jetzt keine Lösung gefunden:
Ich suche nach einer Möglichkeit, Zeilen per Komma zu trennen jedoch benötige ich Ausnahmen.

Eine Zeile kann wie folgt aussehen:
,2,3,4,5,"4,4",1,2,3,"5,6,5,6",,,
Alles was in Hochkommas steht soll als solches bestehenbleiben und nicht getrennt werden. Hochkommas können pro Zeile gar nicht, einmal oder mehrfach vorkommen.

Mein Code sah bis heute vor, den Inhalt zwischen den Hochkommas zu löschen - nun ist er doch von Bedeutung:

Code: Alles auswählen

p=re.compile('".*?"')
splitter = re.compile(',')
f = open('raw.txt','r')
output = open('output.txt','w')
for line in f.readlines():
    line = splitter.split(p.sub('',line))
[...]
Könnte man die Kommas zwischen den Hochkommas nicht zB. Semikolon ersetzen?

Freundliche Grüße
Patrick
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das [mod]csv[/mod]-Modul dürfte da recht hilfreich sein.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Patrick_S
User
Beiträge: 5
Registriert: Dienstag 17. Februar 2009, 17:11

Hallo,

csv reader kannte ich - nicht die dialect Funktion - das sollte mein Problem lösen.

Vielen Dank und Gruß
Patrick
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Du kannst den csv.reader auch ohne explizit einen Dialekt zu registrieren aufrufen:

Code: Alles auswählen

reader = csv.reader(csvfile, delimiter = ',', quotechar  = '"')
Patrick_S
User
Beiträge: 5
Registriert: Dienstag 17. Februar 2009, 17:11

Hallo,

habe beides getestet und es funktioniert nun.

Vielen Dank für die schnelle hilfe.

Gruß
Patrick
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die Aufgabe ist zwar gelöst, aber so könnte ein Miniparser aussehen, der die Aufgabe mit regulären Ausdrücken erledigt:

Code: Alles auswählen

import re

r = re.compile('"([^"]+)"|([^,])|,')
s = ',2,,3,4,5,"4,4",1,2,3,"5,6,5,6",,'

for m in r.finditer(s):
    if m.lastindex:
        print m.group(m.lastindex)
Stefan
Antworten