New_Blog
You must be logged in and have permission to create or edit a blog.
   
PowerShell Anwendergruppe :: Bloglist
   
PowerShell Anwendergruppe Blog
Jul 20

Written by: Rolf Masuch
20.07.2008 19:58

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

powered by metaPost

Tags: