Hey All,
wie kann ich in einer CSV-Datei sämtliche "New Lines" die sich innerhalb der doppelten Anführungszeichen befinden durch Leerzeichen oder Kommata ersetzen?
Die "New Lines" werden im Emacs als ^M angezeigt.
Vielen Dank
Ronny
Anmeldungsdatum: Beiträge: 165 |
Hey All, wie kann ich in einer CSV-Datei sämtliche "New Lines" die sich innerhalb der doppelten Anführungszeichen befinden durch Leerzeichen oder Kommata ersetzen? Die "New Lines" werden im Emacs als ^M angezeigt. Vielen Dank Ronny |
||||
Projektleitung
Anmeldungsdatum: Beiträge: 12832 |
Kannst Du mal ein kleines Beispiel anhängen - nur damit wir über das Format Klarheit haben. |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 165 |
Zeile zwei ist die fehlerhafte Zeile. Sie erzeugt bei COPY in PostgreSQL ein Error. Wenn ich die Datei mit Emacs öffne steht noch hinter jeder Zeile ein ^M |
||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
Man kann sich das Leben leichter machen, wenn man als erstes die Windows-Zeilenenden loswird (z.B. mit Zeichensatz-Konverter (Abschnitt „fromdos-todos“)) oder mit Emacs ( C-x h M-x replace-regex ^M$ Die restlichen Carriage Returns sollte man dann einfach durch Leerzeichen bzw. Kommata ersetzen können: C-x h M-x replace-regex ^M , Wenn man die Ersetzung wirklich ausschließlich innerhalb von Anführungszeichen machen will, ist das etwas tricky, wenn es mehrere perl -pi -e '1 while s/^"(.*)\r(.*)"/"$1,$2"/g' test.csv
|
||||
Anmeldungsdatum: Beiträge: 17552 Wohnort: Berlin |
Ich würde vielleicht versuchen, ob eine Umwandlung von Dos/Win-Format in Linuxformat schon genügt, und Postgresql es dann vielleicht frisst, trotz Zeilenumbruch. Das wäre die Methode, die die Daten so genau wie möglich erhält.
Allerdings weiß ich nicht, ob alle Tools die Du/die man mit psql benutzt mit Linux-Zeilenumbrüchen kooperieren. Dass der Suzukifilter dringend einen Zeilenumbruch braucht, sehe ich auch nicht ein, daher ist eine Umwandlung in Blanks wohl die Methode, die am sichersten hilft.
Methode 1 wäre mit dos2unix vielleicht dennoch zu verwenden, wenn noch andere Windowsartefakte in der Datei sind, wie Textcodierung bei äüö usw. Wenn man Textdateien mit less anschaut kommt man den ^M übrigens leicht auf die Spur. |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 165 |
Danke für die Antworten. @seahawk1986
funktioniert leider nicht. Keine Fehlermeldung aber auch keine Veränderung in der Datei. @seahawk1986 die Zeilenumbrüche am Ende der Zeile sind meines Wissens notwendig. dos2unix hatte ich auch schon getestet - kein Erfolg Ich denke das die Zeilenumbrüche innerhalb der Anführungszeichen entfert werden müssen. Aber wie?? |
||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
In der zweiten Zeile fehlen auf den ersten Blick die abschließenden Anführungszeichen. Kannst du die Datei mal anhängen statt sie in einen Code-Block zu kopieren? Dabei sollte der Whitespace unverändert erhalten bleiben. |
||||
Anmeldungsdatum: Beiträge: 17552 Wohnort: Berlin |
Nein, die zweite Zeile wird in der 3. fortgesetzt - bin ich auch erst drüber gestolpert. Das letzte Feld der Zeile enthält einen Zeilenumbruch, besser gesagt ein Carriage-Return \r, welches hier als Umbruch dargestellt wird. |
||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
Oha, stimmt auffallend 😊 Dann spielt das Forum hier mit rein, wenn es um die Darstellung von Whitespace geht - das '\r' wird eindeutig als '\n' übertragen:
Damit macht mein Perl-Skript dann aber, was es soll und die $ perl -pe '1 while s/^"(.*)\r(.*)"/"$1,$2"/g' data.csv | xxd 00000000: 2232 3334 223b 2230 3130 3122 3b22 4645 "234";"0101";"FE 00000010: 4249 2042 494c 5354 4549 4e22 3b22 3130 BI BILSTEIN";"10 00000020: 3038 3338 223b 2253 454e 534f 5220 5445 0838";"SENSOR TE 00000030: 4d50 2e53 5041 4c49 4e20 474f 4c46 3722 MP.SPALIN GOLF7" 00000040: 3b22 437a 756a 6e69 6b69 223b 2253 7a74 ;"Czujniki";"Szt 00000050: 756b 6122 3b22 3433 2c38 3622 3b22 3022 uka";"43,86";"0" 00000060: 3b22 3022 3b22 3022 3b22 223b 2231 3030 ;"0";"0";"";"100 00000070: 3833 3822 3b22 302c 3037 223b 2234 3035 838";"0,07";"405 00000080: 3432 3234 3030 3833 3836 220d 0a22 3233 4224008386".."23 00000090: 3322 3b22 223b 2248 4946 4c4f 4649 4c54 3";"";"HIFLOFILT 000000a0: 524f 223b 2248 4639 3731 223b 2246 494c RO";"HF971";"FIL 000000b0: 5452 204f 4c2e 2053 555a 554b 4920 414e TR OL. SUZUKI AN 000000c0: 3132 352c 2039 362d 3030 223b 22c3 966c 125, 96-00";"..l 000000d0: 6669 6c74 6572 223b 2253 7a74 756b 6122 filter";"Sztuka" 000000e0: 3b22 312c 3132 223b 2230 223b 2230 223b ;"1,12";"0";"0"; 000000f0: 223e 3130 223b 2222 3b22 4846 3937 3122 ">10";"";"HF971" 00000100: 3b22 302c 3033 3530 223b 2238 3234 3232 ;"0,0350";"82422 00000110: 3531 3131 3430 3822 0d0a 2232 3338 223b 5111408".."238"; 00000120: 2222 3b22 4849 464c 4f46 494c 5452 4f22 "";"HIFLOFILTRO" 00000130: 3b22 4846 4133 3631 3822 3b22 4649 4c54 ;"HFA3618";"FILT 00000140: 5220 504f 572e 2053 555a 554b 4920 5346 R POW. SUZUKI SF 00000150: 5636 3530 2041 5a20 474c 4144 4955 5320 V650 AZ GLADIUS 00000160: 5350 4543 223b 224c 7566 7466 696c 7465 SPEC";"Luftfilte 00000170: 7222 3b22 537a 7475 6b61 223b 2239 2c31 r";"Sztuka";"9,1 00000180: 3022 3b22 3022 3b22 3022 3b22 3222 3b22 0";"0";"0";"2";" 00000190: 223b 2248 4641 3336 3138 223b 2230 2c33 ";"HFA3618";"0,3 000001a0: 3832 3022 3b22 3832 3432 3235 3132 3235 820";"8242251225 000001b0: 3635 220d 0a 65".. Ansonsten gibt es noch einen Umlaut |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 165 |
Also vielleicht hilft der Hexeditor weiter:
zeigt: 00000000: 2235 3436 2037 3730 223b 2230 3130 3122 "546 770";"0101" 00000010: 3b22 4645 4249 2042 494c 5354 4549 4e22 ;"FEBI BILSTEIN" 00000020: 3b22 3130 3038 3338 223b 2253 454e 534f ;"100838";"SENSO 00000030: 5220 5445 4d50 2e53 5041 4c49 4e20 474f R TEMP.SPALIN GO 00000040: 4c46 3722 3b22 437a 756a 6e69 6b69 223b LF7";"Czujniki"; 00000050: 2253 7a74 756b 6122 3b22 3433 2c38 3622 "Sztuka";"43,86" 00000060: 3b22 3022 3b22 3022 3b22 3022 3b22 223b ;"0";"0";"0";""; 00000070: 2231 3030 3833 3822 3b22 302c 3037 223b "100838";"0,07"; 00000080: 2234 3035 3432 3234 3030 3833 3836 220d "4054224008386". 00000090: 0a22 3330 3120 3732 3022 3b22 223b 2248 ."301 720";"";"H 000000a0: 4946 4c4f 4649 4c54 524f 223b 2248 4639 IFLOFILTRO";"HF9 000000b0: 3731 223b 2246 494c 5452 204f 4c2e 2053 71";"FILTR OL. S 000000c0: 555a 554b 4920 414e 3132 350d 0a20 3936 UZUKI AN125.. 96 000000d0: 2d30 3022 3b22 c396 6c66 696c 7465 7222 -00";"..lfilter" 000000e0: 3b22 537a 7475 6b61 223b 2231 2c31 3222 ;"Sztuka";"1,12" 000000f0: 3b22 3022 3b22 3022 3b22 3e31 3022 3b22 ;"0";"0";">10";" 00000100: 223b 2248 4639 3731 223b 2230 2c30 3335 ";"HF971";"0,035 00000110: 3022 3b22 3832 3432 3235 3131 3134 3038 0";"824225111408 00000120: 220d 0a22 3330 3420 3333 3622 3b22 223b ".."304 336";""; 00000130: 2248 4946 4c4f 4649 4c54 524f 223b 2248 "HIFLOFILTRO";"H 00000140: 4641 3336 3138 223b 2246 494c 5452 2050 FA3618";"FILTR P 00000150: 4f57 2e20 5355 5a55 4b49 2053 4656 3635 OW. SUZUKI SFV65 00000160: 3020 415a 2047 4c41 4449 5553 2053 5045 0 AZ GLADIUS SPE 00000170: 4322 3b22 4c75 6674 6669 6c74 6572 223b C";"Luftfilter"; 00000180: 2253 7a74 756b 6122 3b22 392c 3130 223b "Sztuka";"9,10"; 00000190: 2230 223b 2230 223b 2232 223b 2222 3b22 "0";"0";"2";"";" 000001a0: 4846 4133 3631 3822 3b22 302c 3338 3230 HFA3618";"0,3820 000001b0: 223b 2238 3234 3232 3531 3232 3536 3522 ";"824225122565" 000001c0: 0d0a Ich habe das File mal online gestellt: https://autoprofis24.de/test.csv Ronny |
||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
Also steckt da ein Zeilenumbruch mit Wagenrücklauf (\r\n) an der Stelle in der CSV-Datei - das sollte in Emacs (wie in jedem anderen Editor auch aber mit einem Zeilenumbruch dargestellt werden, statt mitten in der Zeile aufzutauchen): 000000c0: 555a 554b 4920 414e 3132 350d 0a20 3936 UZUKI AN125.. 96 Dann würde ich einen anderen Ansatz wählen und die Anzahl der doppelten Anführungszeichen in der Zeile zählen - wenn die ungerade ist, wird die Zeile zusammengezogen und man merkt sich für die folgende Zeile, dass dort eine ungerade Anzahl normal ist:
$ python3 fix_csv.py test.csv "546 770";"0101";"FEBI BILSTEIN";"100838";"SENSOR TEMP.SPALIN GOLF7";"Czujniki";"Sztuka";"43,86";"0";"0";"0";"";"100838";"0,07";"4054224008386" "301 720";"";"HIFLOFILTRO";"HF971";"FILTR OL. SUZUKI AN125, 96-00";"Ölfilter";"Sztuka";"1,12";"0";"0";">10";"";"HF971";"0,0350";"824225111408" "304 336";"";"HIFLOFILTRO";"HFA3618";"FILTR POW. SUZUKI SFV650 AZ GLADIUS SPEC";"Luftfilter";"Sztuka";"9,10";"0";"0";"2";"";"HFA3618";"0,3820";"824225122565" $ python3 fix_csv.py test.csv | xxd 00000000: 2235 3436 2037 3730 223b 2230 3130 3122 "546 770";"0101" 00000010: 3b22 4645 4249 2042 494c 5354 4549 4e22 ;"FEBI BILSTEIN" 00000020: 3b22 3130 3038 3338 223b 2253 454e 534f ;"100838";"SENSO 00000030: 5220 5445 4d50 2e53 5041 4c49 4e20 474f R TEMP.SPALIN GO 00000040: 4c46 3722 3b22 437a 756a 6e69 6b69 223b LF7";"Czujniki"; 00000050: 2253 7a74 756b 6122 3b22 3433 2c38 3622 "Sztuka";"43,86" 00000060: 3b22 3022 3b22 3022 3b22 3022 3b22 223b ;"0";"0";"0";""; 00000070: 2231 3030 3833 3822 3b22 302c 3037 223b "100838";"0,07"; 00000080: 2234 3035 3432 3234 3030 3833 3836 220d "4054224008386". 00000090: 0a22 3330 3120 3732 3022 3b22 223b 2248 ."301 720";"";"H 000000a0: 4946 4c4f 4649 4c54 524f 223b 2248 4639 IFLOFILTRO";"HF9 000000b0: 3731 223b 2246 494c 5452 204f 4c2e 2053 71";"FILTR OL. S 000000c0: 555a 554b 4920 414e 3132 352c 2039 362d UZUKI AN125, 96- 000000d0: 3030 223b 22c3 966c 6669 6c74 6572 223b 00";"..lfilter"; 000000e0: 2253 7a74 756b 6122 3b22 312c 3132 223b "Sztuka";"1,12"; 000000f0: 2230 223b 2230 223b 223e 3130 223b 2222 "0";"0";">10";"" 00000100: 3b22 4846 3937 3122 3b22 302c 3033 3530 ;"HF971";"0,0350 00000110: 223b 2238 3234 3232 3531 3131 3430 3822 ";"824225111408" 00000120: 0d0a 2233 3034 2033 3336 223b 2222 3b22 .."304 336";"";" 00000130: 4849 464c 4f46 494c 5452 4f22 3b22 4846 HIFLOFILTRO";"HF 00000140: 4133 3631 3822 3b22 4649 4c54 5220 504f A3618";"FILTR PO 00000150: 572e 2053 555a 554b 4920 5346 5636 3530 W. SUZUKI SFV650 00000160: 2041 5a20 474c 4144 4955 5320 5350 4543 AZ GLADIUS SPEC 00000170: 223b 224c 7566 7466 696c 7465 7222 3b22 ";"Luftfilter";" 00000180: 537a 7475 6b61 223b 2239 2c31 3022 3b22 Sztuka";"9,10";" 00000190: 3022 3b22 3022 3b22 3222 3b22 223b 2248 0";"0";"2";"";"H 000001a0: 4641 3336 3138 223b 2230 2c33 3832 3022 FA3618";"0,3820" 000001b0: 3b22 3832 3432 3235 3132 3235 3635 220d ;"824225122565". 000001c0: 0a . Wenn das Skript die Datei direkt ändern soll, statt die geänderte Version auf stdout auszugeben, kannst du in Zeile 5 |
||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 165 |
Hey, danke für die kluge Antwort. Das Script funktioniert super. Ich hatte http://a73cram5ay.blogspot.com/2016/01/removing-newlines-in-quoted-strings.html auch schon was gefunden aber dein Script ist viel, viel schneller. Um zusätzlich noch die einige Binärdaten zu entfernen nutze ich es so:
Vielen Dank und einen sonnigen Tag.. Ronny |