Seite 1 von 1
Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 09:51
von kidchino
Hey zusammen,
ich hab ein csv mit zwei Spalten. In Spalte 1 stehen Bezeichnungen, in Spalte 2 stehen Adressen
schwager | max müller, musterstr.12, muster-ort, musterland
Ich würde nun gern alles aus Spalte 2 nach dem ersten Komma entfernen und den rest in Spalte 3 schreiben.
schwager | max müller, musterstr.12, musterort, musterland | max müller
Ich habs so gemacht.
Hab ich irgenwas nicht bedacht?
LG
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 10:08
von sparrow
Ja, wo genau löscht du denn den Rest aus Spalte 2?
Ich bin kein großer Freund von regex, bis ihre Komplexität den Einsatz tatsächlich rechtfertigt.
Wie genau erstellst du denn row? Mit dem csv-Modul aus der Bibliothek, oder mittels split?
Ich würde jedenfalls row[1] mit split aufteilen lassen und dann bequem den ersten Treffen in die neue Spalte 2 schreiben und den Rest in mttels ",".join in die 3.
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 10:37
von kidchino
Hi,
sparrow hat geschrieben:Wie genau erstellst du denn row
Code: Alles auswählen
with open(os.path.join(datei), "rb") as f: #öffnet die jeweilige datei
reader = csv.reader(f, delimiter="\t") #liest die zeilen aus, tabstop getrennt
for row in reader:
sparrow hat geschrieben:wo genau löscht du denn den Rest aus Spalte 2?
Dann ersetze ich ja in Spalte 2 (row[1]) alles nach dem Komme mit ""
Mit split müsste es ja so in die Richtung gehen,
Code: Alles auswählen
name, stadt, land = row[1].split[", "]
row2 = row + [name]
Aber row[1] ist ja nicht zu splitten oder.
LG
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 10:50
von sparrow
kidchino hat geschrieben:
sparrow hat geschrieben:wo genau löscht du denn den Rest aus Spalte 2?
Dann ersetze ich ja in Spalte 2 (row[1]) alles nach dem Komme mit ""
Wenn ich deinen Code aus dem ersten Post richtig verstehe:
Du schreibst den Inhalt von Spalte0
unverändert in die neue Spalte 0.
Du schreibst den Inhalt von Spalte1
unverändert in die neue Spalte 1.
Du machst irgendwelchen regex-Kram mit der Spalte1 und schreibst das Ergebnis in die neue Spalte2.
Du sagst aber im ersten Post, dass der Rest nach dem Komma nicht in der neuen Spalte1 ankommen soll.
Um die Sache mit einem Split zu lösen:
split gibt dir eine Liste von Einträgen zurück. Die brauchst du nicht Variablen zuordnen.
Die neue Spalte1 ist dann Eintrag 0 in den splits
Die neue Spalte2 ist dann der Rest, mit Komma getrennt. Dafür kannst du ", ".
join(splits[1:]) verwenden.
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 11:01
von kidchino
Ich hab mich wohl missverständlich ausgedrückt.
Aus dem Startpost
ich hab ein csv mit zwei Spalten. In Spalte 1
(ich meine row[0]) stehen Bezeichnungen, in Spalte 2
(ich meine row[1]) stehen Adressen
schwager | max müller, musterstr.12, muster-ort, musterland
Ich würde nun gern alles aus Spalte 2
(ich meine row[1]) nach dem ersten Komma entfernen
(Spalte 1 und 2 sollen aber so bleiben, siehe Zitat) und den rest in Spalte 3
(ich meine row[3]) schreiben.
schwager | max müller, musterstr.12, musterort, musterland | max müller
sparrow hat geschrieben:Um die Sache mit einem Split zu lösen:
Danke. Ich probier gleich mal.
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 11:07
von kidchino
kidchino hat geschrieben:Ich hab mich wohl missverständlich ausgedrückt.
Gott, das kann ja auch missverstanden werden, so wie ichs formuliert habe ...
Beim split kommt immer ein Fehler.
Code: Alles auswählen
row[1].split[", "]
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
Ich glaube ich lasse es sonst beim regex. Diese Sachen ""__getitem__"" versteh ich leider nicht so richtig.
Trotzdem danke!!
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 11:10
von sparrow
1. Funktionsaufrufe erwarten Parameter in () nicht in [] daher dein Fehler
2. Falls ich dich doch richtig verstanden habe, kannst du dir das join auch sparen, wie mir gerade einfällt:
Wenn du dir
split() anschaust, dann wirst du sehen, dass man sagen kann nach wie vielen splits er aufhören soll.
Gibt man als 2. Parameter eine Zahl an, werden so viele Element am Anfang der Liste stehen, dann wird aufgehört zu splitten und der Rest steht im letzten Element der Liste.
Da könntest du dir direkt sparen den Rest wieder mit join zusammen zu klöppeln.
Code: Alles auswählen
>>> d = "dies - sind - einzelteile - eines - satzes"
>>> d.split(" - ")
['dies', 'sind', 'einzelteile', 'eines', 'satzes']
>>> d.split(" - ", 1)
['dies', 'sind - einzelteile - eines - satzes']
>>> d.split(" - ", 2)
['dies', 'sind', 'einzelteile - eines - satzes']
>>> d.split(" -", 10)
['dies', ' sind', ' einzelteile', ' eines', ' satzes
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 11:15
von /me
Deine Beschreibung ist sehr unglücklich.
Kurz gesagt: Spalte 1 und 2 bleiben unverändert und die neue Spalte 3 enthält aus Spalte 2 den Teil vor dem ersten Komma.
Das lässt sich auch gedanklich leichter in Programmlogik umsetzen. Spalte 2 wird am Komma zerlegt (split) und dann das erste Element (Index 0) der Ergebnisliste genommen. Dieses Element fügt man in einer neue Spalte an (append).
Code: Alles auswählen
>>> data = ['schwager', 'max müller, musterstr.12, muster-ort, musterland']
>>> data.append(data[1].split(',')[0])
>>> data
['schwager', 'max müller, musterstr.12, muster-ort, musterland', 'max müller']
Re: Regex - Alles aus einem String nach Komma entfernen
Verfasst: Mittwoch 18. Februar 2015, 11:18
von Hyperion
Jetzt bleibt die Frage, wieso man die zusammengesetzten Daten so belässt :K
Ich würde das ja idR. zu Beginn welchen Prozesses auch immer sauber parsen und dann für Ausgaben o.ä. ggf. wieder zusammensetzen.