narthan
Goto Top

Powershell CSV Problem - Leerzeichen entfernen

Guten Tag liebe Administratoren,

ich habe leider ein kleines Problem bei der Bearbeitung einer CSV mit Powershell. Die bereits einmal umgeformte CSV sieht in etwa wie folgt aus (weshalb die Hausnummern in der Spalte "Adresse 2" auch so komisch aussehen mit vorangestellten Nullen - leider weiß ich nicht woher diese Nullen kommen):


"Header 1 fix";"Header 2 fix";"Unternehmen";"Adresse 1";"Adresse 2";"Adresse 3";"Seriennummer"
"no";"yes";"Firma A ";"Hamburg ";"Bahnhofsstr. 0012";"20095";"1231231231"
"no";"yes";"Firma B ";"München ";"Goethestr. 0009";"80331";"1241244211"
"no";"yes";"Firma C ";"Berlin ";"Schillerstr. 0042";"10115";"2131233414"
"no";"yes";"Firma D ";"Hamburg ";"Am Rathaus 0002";"21033";"4561637631"
"no";"yes";"Firma E ";"Hamburg ";"Unter der Bruecke 0022";"21037";"0123456789"


Nun wollte ich mit einem Powershell Skript die überschüssigen Leerzeichen entfernen und das Ergebnis wieder als CSV speichern. Das hat auch funktioniert, nur leider hatte die neue Datei kein Carriage Return mehr und wurde als Single Line Datei dargestellt. Also in etwa so:

"Header 1 fix";"Header 2 fix";"Unternehmen";"Adresse 1";"Adresse 2";"Adresse 3";"Seriennummer";"no";"yes";"Firma A";"Hamburg";"Bahnhofsstr. 0012";"20095";"1231231231";"no";"yes";"Firma B";"München";"Goethestr. 0009";"80331";"1241244211"; usw....


Ich habe dern folgenden Code verwendet:
(Get-Content -path 'C:\temp\test.csv' -Raw) -replace '\s{2,}',' ' | Set-Content -Path 'C:\temp\test1.csv'  

Ich habe es u.a. auch mit ConvertTo-CSV und Export-CSV versucht, aber die Ergebnisse waren noch merkwürdiger.


Ich habe leider bei Google auch nichts hilfreiches gefunden, in Powershell bis ich absoluter Anfänger. Ich wäre für jeden Tipp sehr dankbar! face-smile

Danke im Voraus und schönen Gruß,
narthan

Content-ID: 591192

Url: https://administrator.de/contentid/591192

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

NetzwerkDude
Lösung NetzwerkDude 27.07.2020 um 16:32:50 Uhr
Goto Top
Der Computer macht nicht das was du willst, sondern das was du ihm sagst was er tun soll face-smile

\s steht für alle whitespaces, nciht nur für leer, daher ersetzt das -replace statement eben auch das newline+carrigereturn am ende (da es zwei aufeinanderfolgende whitespaces sind

Um es simpel zu halten, würde vermutlich das hier deinem wunsch ensprechen:
(Get-Content -path 'C:\temp\test.csv' -Raw) -replace ' {2,}',' ' | Set-Content -Path 'C:\temp\test1.csv'  

Wobei mit den CSV cmdlets es vermutlich sauberer wäre:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Ansonsten hilft es immer im leben RegEx zu lernen:
https://www.regular-expressions.info/shorthand.html
narthan
narthan 27.07.2020 um 16:39:40 Uhr
Goto Top
Hallo NetzwerkDude,

vielen Dank erstmal, hat super funktioniert!

Das dachte ich mir mit den Carriage Returns, wusste aber leider nicht, wie ich das im replace-Befehl sagen kann und hatte es auch nicht gefunden. So ganz verstehe ich auch nicht, weshalb es nun funktioniert. Sucht -replace ' {2,}',' ' nicht genauso nach mehrfachen Leerzeichen und ersetzt diese? Oder sind CR und Newline spezielle "White Spaces"?

Danke für den Link, ich werde mich mal über RegEx schlau lesen! face-smile

Viele Grüße
narthan
NetzwerkDude
NetzwerkDude 27.07.2020 um 16:59:53 Uhr
Goto Top
Mach am besten die original csv auf mit einem programm das dir alle zeichen anzeigt, soweit ichs im kopf habe macht dos/windows immer /r/n als "newline" - also carriage return + linefeed - die werden als zwei whitespaces interpretiert.

Aber nur so aus dem Kopf, schreib das mit dem Handy, kanns gerade nicht nachprüfen