Standard1988
Anmeldungsdatum: 28. Dezember 2010
Beiträge: 87
|
Hallo Zusammen, ich lese z.B. folgendes ein: 01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich und möchte nun gerne aus dem "," ein ";" machen außer natürlich bei den Beträgen. Ich bekommen es weder mit replace noch mit sub hin. re.sub(r',',';', zeile) Hat jemand eine Idee? LG
Standard Bearbeitet von sebix: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
Standard1988 schrieb:
re.sub(r',',';', zeile)
So geht das nicht, weil dieser Ausdruck nicht erkennen kann, ob das Komma in einem Feldwert (also innerhalt doppelter Anführungsstriche) oder als Feldbegrenzer auftritt. Dafür brauchst Du mehr Kontext.
Hat jemand eine Idee?
Das einfachste ist, die Zeile mit einem CSV-Parser zu parsen und dann mit neuen Trennern zu schreiben. Man kann sich auch mit einem geeigneten Regulären Ausdruck behelfen: | >>> ";".join(re.findall('"[^"]*"|[^,]+', '01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich'))
'01.02.17;28.02.17;28;Versicherung;"-367,84";"-13,14";Monatlich'
|
|
Axel-Erfurt
Anmeldungsdatum: 18. Mai 2016
Beiträge: 1347
|
so würde es auch gehen
| #!/usr/bin/python
# -- coding: utf-8 --
from csv import reader
text = []
infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich']
for line in reader(infile, delimiter = ","):
for nline in line:
text.append(nline)
print(";".join(text))
|
|
sebix
Ehemalige
Anmeldungsdatum: 14. April 2009
Beiträge: 5584
|
Ich wuerde auch das csv-Modul zum parsen und schreiben verwenden, da es alle Spezialfaelle beachtet, die vorkommen koennen: https://docs.python.org/3.5/library/csv.html DictReader und DictWriter finde ich ganz angenehm, weiters musst du den Dialekt bzw delimiter fuer den output entsprechend deinen Beduerfnissen setzten.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
Axel-Erfurt schrieb: so würde es auch gehen
Der Ansatz funktioniert nicht mit mehreren Zeilen. Das kann man aber einfach reparieren - und dann wird es auch noch kürzer, weil append hier überflüssig ist: | #!/usr/bin/python
# -- coding: utf-8 --
from csv import reader
infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich', '1,2,3,4,5,6,7']
for line in reader(infile, delimiter = ","):
print(";".join(line))
|
Außerdem verstehe ich nicht, warum Du nicht auch gleich den csv.writer benutzt, wenn Du schon den reader nimmst. Das sorgt dann auch für ordentliches Quoting: | #!/usr/bin/python
# -- coding: utf-8 --
import csv
import sys
infile = ['01.02.17,28.02.17,28,Versicherung,"-367,84","-13,14",Monatlich', '1,2,3;3,4,5,6,7']
out = csv.writer(sys.stdout, delimiter = ';')
for line in csv.reader(infile, delimiter = ","):
out.writerow(line)
|
|