Kleine PowerShell-Challenge – CSV-Daten ohne leere Spalten ausgeben

Ich liebe kleine „Programmier-Challenges“, da sie eine Gelegenheit bieten das eigene, in der Regel mühsam erworbene, Wissen anzuwenden. Und da ich mich nach wie vor relativ viel mit der PowerShell beschäftige liegt es nahe, eine solche Herausforderung mit der PowerShell zu meistern. Eine Art Jogging fürs Gehirn. Die PowerShell ist aber nur Mittel zum Zweck. Ob die Challenge mit PowerShell, Python oder einer anderen Programmiersprache spielt dabei keine Rolle.

Die heutige Herausforderung ist einfach formuliert: Gesucht ist eine Technik, durch die beim Konvertieren von CSV-Daten in Objekte nur Spalten berücksichtigt werden, in denen mindestens ein Wert enthalten ist. Leere Spalten sollen nicht ausgegeben werden.

Klingt zunächst einfach. Die Umsetzung ist es auch, sofern man weiß, dass jedes PowerShell-Objekt eine Eigenschaft mit dem Namen Psobject besitzt. Allerdings kann man sich auch schnell in eine Sackgasse manöverieren.

Ausgangspunkt sind CSV-Daten, die in der Variablen $CSVDaten enthalten sind.

Im Mittelpunkt steht die unscheinbare Eigenschaft PsObject, die es bei jedem Objekt gibt. Sie liefert Informationen über die Beschaffenheit des Objekts. Dazu gehört die Properties-Eigenschaft. Sie liefert nicht nur die Namen aller Eigenschaften, sondern über die Value-Eigenschaft auch deren Werte.

Die folgende Befehlsfolge gibt die Namen der Eigenschaften aus bei den Objekten aus, die aus CSV-Konvertierung resultieren.

Das kann Get-Member doch auch, allerdings erhält man hier lediglich die Members, nicht die einzelnen Werte.

Die folgende Befehlsfolge gibt zunächst nur die Namen der Eigenschaften aus, die bei allen aus der CSV-Konvertierung resultierenden Objekten mindestens einen Wert besitzen.

Die Gruppierung ist erforderlich, da die Namen der Eigenschaften pro Objekt ja mehrfach ausgegeben werden. Der Name soll aber nur einmal zurückgegeben werden.

Für den nächsten Schritt werden die Namen einer Variablen zugewiesen.

Jetzt sind alle Properties bekannt, die einen Wert besitzen. Doch wie werden diese Namen verwendet? Ganz einfach: Per Select-Object.

Jetzt soll alles noch in eine Form gegossen werden, die eine Wiederverwenbarkeit vereinfacht. Es wird eine Function definiert. Im Folgenden Beispiel heißt die Function ConvertFrom-CSVData. Das ist in diesem Fall vertretbar, da die Function nur wenige Parameter besitzt, die sich daher mit wenig Aufwand hinzufügen und an die „wahre“ ConvertFrom-CSVData-Function weiterrerichen lassen. In der Praxis wäre eine Proxy-Function die flexiblere Lösung.

Wichtig ist zu wissen, dass wenn eine Function denselben Namen besitzt wie ein Cmdlet, die Function aufgerufen wird und nicht das Cmdlet. Soll die Function ausgeführt werden, muss der Modulname mit einem Backslash am Ende vorangestellt werden.

Hier ist die komplette Function:

Damit wird eine Konvertierung jetzt sehr einfach:

Lohnt sich der ganze Aufwand? Wie immer lässt sich die Frage nicht eindeutig beantworten. Ja, weil es wie Eingangs erwähnt ein gutes „Gehirn-Jogging“ ist. Wer selber zu einem Ergebnis gekommen ist, wird mit Sicherheit stolz auf sich sein und das Gefühl haben die PowerShell besser zu beherrschen. Nein, weil es natürlich im IT-Umfeld Wichtigeres gibt. Auf der anderen Seite: Ich erlebe es immer wieder, dass es in den IT-Abteilungen von Firmen und Behörden immer nur 1-2 „PowerShell-Gurus“ gibt. Wenn überhaupt. In den IT-Abteilungen in Deutschland fehlt es eindeutig an PowerShell-Know how.

Zum Schluß soll das Ganze auch in der Praxis ausprobiert werden.

Ausgangspunkt it etwas CSV-Text:

Der folgende Befehl gibt nur Spalten aus, in denen mindestens ein Wert enthalten ist. Die Spalten EAD1 und EAD3 werden also nicht ausgegeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.