Falsche Trennzeichen in Textdatei

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
meli99
User
Beiträge: 1
Registriert: Dienstag 11. August 2026, 22:01

Guten Tag,

ich habe folgendes Problem. Ich habe eine Datei mit 50.000 Zeilen wo mehrer Stufen eines Experiments abgebildet sind mit unterschiedlichen Spaltenanzahlen und Spaltenüberschrift. Die Spaltenüberschrift ist zweizeilig und lässt sich von mir mittels einer YAML Konfiguration auf einen neuen Namen zuweisen, mittels welchen ich dann später meine Auswertung betreiben möchte. Da ich ein größeres Projekt gestalte, arbeite ich mit Klassen.

Nun habe ich das Problem dass die Messwerte sowie Spaltentrennung dasselbe Zeichen verwendet. Anstelle 0.0 , 1.375 , 50, 0.00008 .... steht bei mir 0,0,1,375,50,0,00008. Die Originaldatei ist eine CSV und sämtliche Unicode Einstellungen können das Problem nicht beheben, selbiges mit der Auswahl des Trennzeichens. Auch das Umwandeln der Daten in eine txt Datei ändert das Problem nicht. Zwischenzeitlich habe ich auch für kleinere Kommastellen ein entsprechendes e für die Nachkommastellen, dass auch nicht erkannt wird :

81,92,3,039,0,170923,128,038,29,97,749,79,0,896916,0,91673,0,96375665,0,0366124,3,20,16,00,0,00,0,00,0,001,0,01,0,20,7,58642e-6,3,009180e-5,3,855498,3,85532,200,00,0,00000,1,18,9,77570e-4

jedes ungerade Komma sollte dabei ein '.' sein, jedes zweite Komma sollte ein ',' bleiben und die e in ein float verwandelt werden also wie hier:

81.92,3.039,0.170923,128.038,29.97,......

Meine Frage ist nun wie ich die Werte so aufbereiten kann dass ich sie auswerten kann, ohne meine Konfiguration neu aufsetzen zu müssen? Mit Regex hatte ich derweil auch noch keinen Erfolg.
Sirius3
User
Beiträge: 18426
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher hast Du die Daten? Es ist nur die zweit beste Lösung, im Nachhinein kaputte Daten zu reparieren, wenn man sie auch gleich richtig schreiben könnte.
Ein regulärer Ausdruck würde so aussehen:

Code: Alles auswählen

re.sub("(\d+),(\d+(?:e[+-]?\d+)?,|$)", lambda m: f"{m.group(1)}.{m.group(2)}", line)
Benutzeravatar
Kebap
User
Beiträge: 812
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Richtig wäre, die CSV so schreiben zu lassen, dass sie sich an die CSV-Spezifikation hält, und eindeutig lesbar ist.

Also entweder direkt ein Semikolon als Trenner zwischen den Zahlen, oder die Zahlen in Anführungszeichen setzen, usw.

Das nachträglich zu reparieren scheint mir aufwändiger und fehleranfälliger.

Haben bspw. wirklich alle Zahlen ein Dezimalkomma? In deinem Beisiel stand ja auch 50 und nicht 50,0 :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten