franz-josef-ii
Goto Top

Powershell - csv - Sonderzeichen

Einen wunderschönen arbeitsreichen Tag

Ich bin gerade dabei csv-Dateien mittels Powershell zu vergleichen und Unterschiede bzw Gemeinsamkeiten abzuspeichern. Mein Problem dabei ist, ok sind die "fremdländischen Zeichen" face-wink Die Umlaute funktionieren, die habe ich im Griff, es geht z.B. um die "tschechischen Hatscheks", also das c mit dem Hakerl drauf oder auch andere Buchstaben die ein Apostroph drüber haben.

Ich bekomme die csv's utf8 (ohne bom), da stimmt alles. Nachdem vergleichen etc ist in der Enddatei, naja nix mehr so richtig face-wink Ich habe sowohl mit out-file also auch mit export-csv herumexperimentiert, gc und sc ....... alles was das Internet so halt geboten hat. Als Ergebnis hatte ich entweder eine utf8-bom oder eine ucs-2 le bom mit "interessanten" Werten.

Wie kann ich die Powershell dazu übereden, daß sie in die Codierung nicht eingreift oder welche andere Möglichkeiten habe ich?

Content-Key: 388390

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

Printed on: April 16, 2024 at 12:04 o'clock

Member: MarkBeaker
MarkBeaker Oct 03, 2018 at 13:37:17 (UTC)
Goto Top
Hallo,

kannst du den Code bitte posten.

Danke
Member: Kraemer
Kraemer Oct 04, 2018 at 07:08:02 (UTC)
Goto Top
Moin,
Zitat von @Franz-Josef-II:
Wie kann ich die Powershell dazu übereden, daß sie in die Codierung nicht eingreift oder welche andere Möglichkeiten habe ich?
die Powershell greift nicht in die Codierung ein! Sie liest die Daten ja anscheinend korrekt. Export-CSV kennt imho nur UTF8 mit BOM. Per .net solltest du eine Lösung bauen können:
[IO.File]::WriteAllLines($filename, $content)
Leider verstehe ich überhaupt nicht, was "interessante Werte" und "nicht mehr so richtig" sein soll.

Gruß
Member: Franz-Josef-II
Franz-Josef-II Oct 04, 2018 updated at 11:49:09 (UTC)
Goto Top
Hat jetzt ein bißchen gedauert, die Echtdaten kommen nicht so gut an, wenn ich die öffentlich ..... face-wink

Also die Ursprungsdatei schaut so aus (utf8):

Spalte1;Spalte2;Spalte3;Spalte4
Raum303;TALIĆ;Aik;01.04.2018
Raum303;Čejkoska;Maria;01.04.2018
Raum303;Ünstantinoj;Gabriel;01.08.2018
Raum487;Zakić;Ivanowa;01.08.2018
Raum487;Červesia;Bier;01.08.2018
Raum487;Bodankšić;Siegfrid;01.10.2018
Raum487;Barić;Anđero;01.10.2018
Raum487;Jastić;Vladimir;01.10.2018

Jetzt importiere ich die beiden zu vergleichen csv-Dateien, vergleiche sie und speichere sie ab:

#Importieren
$a = Import-CSV .\test.csv -Delimiter ";"  
$b = Import-CSV .\test2.csv -Delimiter ";"  

# Vergleich und erstellen einer Datei
Compare $a $b -Property Spalte2,Spalte3,Spalte4 -IncludeEqual -ExcludeDifferent -PassThru | select Spalte1,Spalte2,Spalte3,Spalte4 | Export-CSV .\c.csv -Delimiter ";" -NoTypeInformation  

Da kommt jetzt folgendes utf8 heraus:

"Spalte1";"Spalte2";"Spalte3";"Spalte4"  
"Raum303";"TALI?";"Aik";"01.04.2018"  
"Raum303";"?ejkoska";"Maria";"01.04.2018"  
"Raum303";"?nstantinoj";"Gabriel";"01.08.2018"  
"Raum487";"Zaki?";"Ivanowa";"01.08.2018"  
"Raum487";"?ervesia";"Bier";"01.08.2018"  
"Raum487";"Bodank?i?";"Siegfrid";"01.10.2018"  
"Raum487";"Bari?";"An?ero";"01.10.2018"  
"Raum487";"Jasti?";"Vladimir";"01.10.2018"  

Also die Sonderzeichen werden durch Fragezeichen ersetzt.

Compare $a $b -Property Spalte2,Spalte3,Spalte4 -IncludeEqual -ExcludeDifferent -PassThru | select Spalte1,Spalte2,Spalte3,Spalte4 | Out-File .\c.csv

Dann kommt das heraus (UCS-2 LE BOM):

Spalte1 Spalte2     Spalte3  Spalte4   
------- -------     -------  -------   
Raum303 TALIĆ       Aik      01.04.2018
Raum303 Čejkoska    Maria    01.04.2018
Raum303 Ünstantinoj Gabriel  01.08.2018
Raum487 Zakić       Ivanowa  01.08.2018
Raum487 Červesia    Bier     01.08.2018
Raum487 Bodankšić   Siegfrid 01.10.2018
Raum487 Barić       Anđero   01.10.2018
Raum487 Jastić      Vladimir 01.10.2018

Wobei ich mich jetzt ein bißchen verrannt habe, ich weiß jetzt nicht mehr, mit welchen Befehlen ich die "interessanten Zeichen" bekomme habe face-sad

Ein paar Beispiele eben dieser (es handelt sich um Namensteile, allerdings im Original sind dort keine Umlaute sondern eben die Hatscheks und Apostrophe):
IĆ
ÄŒej
oç
Ãœns
ić
Mitglied: 137289
137289 Oct 04, 2018 updated at 11:54:05 (UTC)
Goto Top
Du gibst ja auch kein Encoding beim Im- und Export an, wie soll da die Powershell automatisch das "wirklich" passende Encoding nehmen wenn die Datei kein BOM hat face-smile.
#Importieren
$a = Import-CSV .\test.csv -Delimiter ";" -Encoding UTF8  
$b = Import-CSV .\test2.csv -Delimiter ";" -Encoding UTF8  

# Vergleich und erstellen einer Datei
Compare $a $b -Property Spalte2,Spalte3,Spalte4 -IncludeEqual -ExcludeDifferent -PassThru | select Spalte1,Spalte2,Spalte3,Spalte4 | Export-CSV .\c.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
Member: Franz-Josef-II
Franz-Josef-II Oct 04, 2018 at 12:34:56 (UTC)
Goto Top
Keine Änderung face-sad Genau gleiches Verhalten
Mitglied: 137289
137289 Oct 04, 2018 updated at 12:37:50 (UTC)
Goto Top
Hier geht's. Wir haben deine Ausgangsdateien nicht ....
Member: Franz-Josef-II
Franz-Josef-II Oct 04, 2018 at 12:44:33 (UTC)
Goto Top
Zitat von @137289:

Hier geht's. Wir haben deine Ausgangsdateien nicht ....


Stimmt.


Ich denke, ich werde alles über Bord werfen und komplett von vorne wieder anfangen (und Deinen Tipp miteinbauen) face-wink Irgendwo pfuscht mir da was drein face-sad
Die letzte Datei, ist das bei Dir eine utf8 oder eine utf8 bom?
Mitglied: 137289
137289 Oct 04, 2018 updated at 14:22:05 (UTC)
Goto Top
Zitat von @Franz-Josef-II:
Die letzte Datei,
?? Meine Test-Dateiquelle war eine UTF-8 kodierte ohne BOM.
Die CMDLets geben immer eine Datei mit BOM aus, ist auch gut so, dann erkennen Programme auch gleich worum es geht! Willst du das nicht, s. Kommentar von Krämer, mit den .NET Methoden die Daten wegschreiben.