DrHitch - Fotolia
ConvertFrom-String: Unstrukturierte Daten-Strings in der PowerShell parsen
Die PowerShell 5.0 bietet neue Möglichkeiten zum Parsen unstrukturierter Daten-Strings: das Cmdlet ConvertFrom-String inklusive Template-Integration.
Einer der großen Vorteile, der die PowerShell gegenüber anderen Skriptsprachen auszeichnet, ist die hervorragende Möglichkeit, mit Objekten umzugehen. Objekte bieten hier einen strukturieren Weg, um Informationen über verschiedene Methoden hinweg zu repräsentieren.
Allerdings kann natürlich nicht alles als ordentlich strukturiertes Objekt wiedergegeben werden. Manchmal müssen Administratoren auch mit unstrukturierten Daten umgehen, beispielsweise mit einem Daten-String als Output einer Legacy-Anwendung. Diese Daten müssen dann irgendwie in ein strukturiertes Format überführt werden.
Aus diesem Grund dürften Windows-Administratoren die vielen neuen Funktionen der Windows PowerShell 5.0 zu schätzen wissen, allen voran, wie sich damit mit unstrukturierten Daten umgehen lässt. Eine der wichtigsten neuen Funktionen in diesem Zusammenhang ist das Cmdlet ConvertFrom-String, mit dem sich die Zeit für das Konvertieren unstrukturierter Daten zu einem PowerShell-Objekt deutlich reduzieren lässt.
Das ConvertFrom-String-Cmdlet wurde ursprünglich von Microsoft Research für das FlashExtract-Projekt entwickelt und konvertiert unstrukturierte Zeichenketten über einen Parser auf Basis von Trennzeichen beziehungsweise Separatoren oder auch über Templates zu strukturieren Objekten.
ConvertFrom-String und der Delimiter-Parameter
Trennzeichen oder Separatoren werden in der PowerShell als Delimiter bezeichnet. Über den Delimiter-Parameter lassen sich also unstrukturierte Daten-Strings über reguläre Ausdrücke in unterschiedliche Elemente aufteilen.
Nehmen wir als Beispiel an, wir haben eine Zeichenkette mit Buchstabengruppen vorliegen, die durch zwei Leerzeichen voneinander getrennt sind. Um hier die einzelnen Gruppen getrennt zu erhalten, lassen sich als Trennzeichen, also als Delimiter, zwei Leerzeichen verwenden. Anschließend kann das ConvertFrom-String-Cmdlet auf den Daten-String angewandt werden.
Abbildung 1 zeigt für diesen Vorgang ein einfaches Beispiel. Die Objekte P1, P2 und P3 können dann je nach Bedarf weiterverwendet werden. Allerdings ist die Bezeichnung P1, P2 und P3 keine besonders intuitive Beschreibung der Objekte. Über den PropertyNames-Parameter kann daher eine aussagekräftigere Namensgebung gewählt werden, beispielsweise Gruppe 1, Gruppe 2 und Gruppe 3.
Auch wenn das soweit natürlich sehr nützlich sein kann, kannte die PowerShell mit dem Cmdlet ConvertFrom-StringData bereits eine sehr ähnliche Funktion. Wesentlich interessanter an ConvertFrom-String ist daher die Möglichkeit, zum Parsen Templates zu verwenden. Das Template macht der Zeichenkette dann gewisse Vorgaben, das ConvertFrom-String-Cmdlet kann damit die Struktur des Strings besser verstehen und parsen. Als einfaches Beispiel können wir den folgenden Text nehmen:
Name: Craig Trudeau
Name: Merle Baldridge
Name: Adam Bertram
Name: George Lucas
Dem ConvertFrom-String-Cmdlet kann nun über ein Template mitgeteilt werden, an welcher Stelle sich Vor- und Nachname befinden:
Name:{FirstName*:Adam} {LastName:Bertram}
Name:{FirstName*:Merdfdfle} {LastName:Baldfdfd}
Damit erhalten wir, wie in Abbildung 2 zu sehen, vier Objekte mit FirstName- und LastName-Werten.
Indem man dem Template nur zwei Instanzen vorgibt, erkennt das Cmdlet das Muster und kann auch alle anderen in der gleichen Weise parsen.
Jede Zeile fängt mit Name: an, dieser Teil soll aber nicht ausgegeben werden und muss daher in das Template integriert werden. Name: repräsentiert einen Buchstaben-String, den das ConvertFrom-String-Cmdlet finden muss. Der Text innerhalb der geschwungenen Klammern gibt an, was als Ergebnis ausgegeben werden soll. In diesem Fall muss auch der PropertyNames-Parameter nicht angewandt werden, weil der Property-Name bereits innerhalb des Templates angegeben werden kann. Ein Asterisk muss verwendet werden, wenn die Zeichenkette mehrere Referenzen enthält, die den Template-Vorgaben entsprechen. Der Asterisk gibt damit den Beginn einer neuen Gruppe an.
Der genutzte Template-String entspricht nicht den Namen innerhalb des Textes. Man benötigt hier lediglich eine Repräsentation dessen, wie der String aussehen soll. Das Cmdlet wird dann den Rest erledigen. Um diesen Vorgang zu testen, bietet Abbildung 3 einen Code-Block zum Erstellen, Lesen und Parsen einer Textdatei mit ConvertFrom-String.
Komplexere Daten-Strings werden sicherlich stärkere Anpassungen erfordern. Prinzipiell kann das Cmdlet aber so gut wie jeden String parsen, sofern man über ein Template vorab nur die richtige Struktur vorgibt. Für weitere Beispiele und einen tieferen Einblick empfiehlt sich ein Blog-Post von Stephen Owen zum fortgeschrittenen Parsen mit ConvertFrom-String.
Folgen Sie SearchDataCenter.de auch auf Twitter, Google+ und Facebook!