Hallo Community,
im ersten Teil der Spielereien mit import-csv habe ich euch erste Hinweise für die Arbeit mit dem Cmdlet gegeben.
Aber wie der Name des Cmdlet bereits sagt, importiert es CSV Dateien. In einer solchen Datei sind die Werte mit einem Komma getrennt. In einem auf deutsch konfigurierten Betriebssystem und Office ist das Trennzeichen aber das Semikolon (;) bzw. die doppelten Anführungsstriche um ein Semikolon herum (";").
Was macht jetzt import-csv daraus? Zum Vergleich die Dateien in der englischen und zwei deutschen Versionen.
Import-ENU.csv
Spalte1,Spalte2,Spalte3
Wert1,Wert2,Wert3
Import-DEU1.csv
Spalte1;Spalte2;Spalte3
Wert1;Wert2;Wert3
Import-DEU2.csv
"Spalte1";"Spalte2";"Spalte3"
"Wert1";"Wert2";"Wert3"
Beim jeweiligen Import kommen sehr unterschiedliche Ergebnisse raus.
Import-Csv d:\temp\Import-ENU.csv | %{write-host $_} liefert das gewohnte Ergebnis:
@{Spalte1=Wert1; Spalte2=Wert2; Spalte3=Wert3}
Import-Csv d:\temp\Import-DEU1.csv | %{write-host $_} zeigt da schon ein ganz anderes Bild:
@{Spalte1;Spalte2;Spalte3=Wert1;Wert2;Wert3}
Genau so wie Import-Csv d:\temp\Import-DEU2.csv | %{write-host $_}
@{Spalte1;"Spalte2";"Spalte3"=Wert1;"Wert2";"Wert3"} liefert...
Zur weiteren Verwendung der Werte kann also eine, mit einem deutschen Excel erzeugten, CSV Datei (momentan) nicht sinnvoll eingesetzt werden.
Abhilfe kann hier mit einem generischen PowerShellObjekt, das mit dem Cmdlet add-member zu einer Tabelle ausgebaut wird, gefunden werden.
function fill-object($Zeile) {
$temp = $zeile.split(";")
$CustomObj = new-object psobject
add-member noteproperty Spalte1 $temp[0].substring(1,$temp[0].length - 2) -PassThru -InputObject $CustomObj > $null
add-member noteproperty Spalte2 $temp[1].substring(1,$temp[1].length - 2) -PassThru -InputObject $CustomObj > $null
add-member noteproperty Spalte3 $temp[2].substring(1,$temp[2].length - 2) -PassThru -InputObject $CustomObj
}
Der Aufruf sieht dann so aus:
Get-Content d:\temp\Import-DEU2.csv | %{fill-object $_} | %{Write-Host $_}
Das Ergebnis liefert aber sowohl die eigentliche Headerzeile als auch die Datenzeile zurück.
@{Spalte1=Spalte1; Spalte2=Spalte2; Spalte3=Spalte3}
@{Spalte1=Wert1; Spalte2=Wert2; Spalte3=Wert3}
Das könnte man verhindern indem die Headerzeile gelöscht wird. Nicht perfekt, aber auf jeden Fall ist die Datenzeile identisch zum Import der "echten" CSV.
Bei der Arbeit mit "deutsch formatierten" CSV Dateien kann es zu überraschenden Ergebnissen kommen. Mit kleinen "Hilfsfunktionen" kann doch noch das gewünschte Ziel erreicht werden. Diese "Spielerei" kann euch hoffentlich ein paar Minuten Arbeitszeit / Lernkurve sparen.
Weiterhin viel Spaß bei der Arbeit mit der PowerShell.
Rolf