Home PowerShell Grundlagen Import-CSV WorkShop
formats

Import-CSV WorkShop

In den PowerShell Foren kommt sehr häufig die Frage nach dem richtigen Umgang mit CSV Dateien in der PowerShell.
Hierbei übersehen viele die Tatsache: PowerShell erzeugt und verarbeitet Objekte keinen Text!

CSV und XML sind strukturierter Text. Dieser strukturierte Text wird beim einlesen von PowerShell in Objekte umgewandelt.

Ich erkläre hier in einem kleinen Import-CSV Workshop wie man mit PowerShell CSV Importiert und verarbeitet.

PowerShell benutzt zum einlesen von CSV Daten das Cmdlet Import-CSV

Vor dem benutzen eines Cmdlet Befehls sollte man sich mit dem Befehl vertraut machen und die Hilfe zu dem Cmdlet lesen! Hier sollte man den Parameter -Full benutzen um die volle Hilfe (mit Beispielen) zu sehen.

Import-CSV Hilfe

Oder: http://www.colorconsole.de/PS_Windows/de/Import-CSV.htm

Das CSV Format

Das Dateiformat CSV steht für Englisch: Comma-separated values.
Die Regeln zu Erstellung einer CSV Datei werden im RFC 4180 von der Internet Engineering Task Force (IETF) beschrieben.
Siehe: http://tools.ietf.org/html/rfc4180
Siehe Wikipedia: http://de.wikipedia.org/wiki/CSV_%28Dateiformat%29

Der Text in einer CSV Datei muss den Regeln aus dem RFC 4180 entsprechen.

Man kann sich eine CSV Datei, wie eine Excel Tabelle mit Überschriften für jede Spalte, in der ersten Zeile vorstellen.

CSV Trennzeichen (Englisch: delimiter)

Für das Zeichen, das die einzelnen Datenspalten voneinander trennt, ist das Komma vorgesehen.
Da in Deutschland das Komma als Dezimaltrennzeichen genutzt wird, wird in deutschen CSV Dateien häufig das Semikolon als Trennzeichen (Englisch: delimiter) benutzt.
Wenn das Trennzeichen nicht das Komma ist, muss das Trennzeichen mit dem Parameter –Delimiter angegeben werden oder man benutzt den Parameter -UseCulture.

Das Trennzeichen der Aktuell eingestellten Kultur kann man mit folgendem Befehl abfragen:

CSV Kopfzeile (Englisch: Header)

Die erste Zeile einer CSV Datei definiert die Namen für jede einzelne Datenspalte.
Das Cmdlet Import-CSV benötigt zwingend eine Kopfzeile (Englisch: Header).
Ist die Kopfzeile in der Datei nicht vorhanden, kann diese mit dem Parameter –Header frei definiert werden.

Beispiel CSV

Ich gehe nun von folgender CSV Datei im Pfad C:\temp\users.csv aus:

Vorname;Nachname;UserID;Auftrag
Peter;Maffay;PetMaffa;Add
Sabine;Lisicki;SabLisic;Remove
Claudia;Schiffer;ClauSchi;Add
Herrman;Hesse;HerrHess;Add
Walter;Moers;WaltMoer;Remove

(Zum Mitmachen bitte den Text in den Texteditor Notepad einfügen und als Users.csv abspeichern)

Import-CSV erzeugt Objekte, die haben Properties !

Beim Einlesen mit Import-CSV wandelt PowerShell den Text in Objekte um!
Jede Zeile wird zu einem Objekt im Speicher umgewandelt. Das Objekt enthält nur die Daten der Zeile.
Jede Spalte wird in den Objekten zu einem Property (Eigenschaft).
Ein Property in einem Objekt  ist ein Wert der über einen Namen angesprochen werden kann (Name=Wert).
Der Name des Properties ist der Name der Spalte aus der CSV Header Zeile!
Nun lese ich die CSV mit dem Cmdlet Import-CSV ein (mitmachen):

Ergebnis:

Vorname Nachname UserID   Auftrag
——- ——– ——   ——-
Peter   Maffay   PetMaffa Add
Sabine  Lisicki  SabLisic Remove
Claudia Schiffer ClauSchi Add
Herrman Hesse    HerrHess Add
Walter  Moers    WaltMoer Remove

Man sieht auch hier gibt PowerShell eine Tabelle aus. Mit Überschriften und Spalten.
Bei mehr als 4 Spalten stellt PowerShell jedes Objekt als Liste von Name=Wert Paaren dar,  nicht als Tabelle!

Beispiel CSV als Liste:

Ergebnis:

Vorname  : Peter
Nachname : Maffay
UserID   : PetMaffa
Auftrag  : Add

Vorname  : Sabine
Nachname : Lisicki
UserID   : SabLisic
Auftrag  : Remove

Vorname  : Claudia
Nachname : Schiffer
UserID   : ClauSchi
Auftrag  : Add

Vorname  : Herrman
Nachname : Hesse
UserID   : HerrHess
Auftrag  : Add

Vorname  : Walter
Nachname : Moers
UserID   : WaltMoer
Auftrag  : Remove

Properties mit dem Punkt auslesen

Ein Property von einem Objekt kann man mit dem Punkt als Pfadangabe (Punkt Operator) auslesen oder setzten.

Hier wird mit einer ForEach Schleife jedes Objekt in dem Array (Liste) durchlaufen und die Spalte Nachname ausgegeben (Mitmachen):

Oder

Properties mit dem Select-Object Cmdlet auslesen

Oder man kann nach dem einlesen die einzelnen Spalten (Properties) der einzelnen Objekte mit dem Select-Object Cmdlet ansprechen (Mitmachen):

Oder

Oder

Objekte Filter mit Where-Object

Man kann auch alle anderen xxx-Object Cmdlets mit den Objekten verwenden.

Compare-Object
ForEach-Object
Group-Object
Measure-Object
Select-Object
Sort-Object
Where-Object

Properties herausfinden mit Get-Member

Wenn man nicht weiß welche Properties ein Objekt bietet, kann man dies mit dem Cmdlet Get-Member erfragen!

Ergebnis (Hier interessieren uns nur die NoteProperties):

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
—-        ———-   ———-
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Auftrag     NoteProperty System.String Auftrag=Add
Nachname    NoteProperty System.String Nachname=Maffay
UserID      NoteProperty System.String UserID=PetMaffa
Vorname     NoteProperty System.String Vorname=Peter

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
Kommentare deaktiviert  comments