[MS PowerShell] Aus Textdatei Zeilen zerlegen

Boron

Commander
Registriert
Sep. 2001
Beiträge
2.785
Hallo zusammen,

ich habe eine Textdatei aus deren Inhalt ich per MS PowerShell (läuft auf Windows 2012 R2 Server) Inhalt extrahieren möchte. Das ganze soll als PowerShell Skript umgesetzt sein, weil ich auf dem Server Perl, Python oder sonst was nicht installieren will.

Die Datei enthält Zeilen der folgenden Art:
Code:
 ea_model_02                     | postgres      | UTF8      | German_Germany.1252 | German_Germany.1252 | 
 ea_model_03                     | postgres      | UTF8      | German_Germany.1252 | German_Germany.1252 |
Außerdem gibt es noch drei Zeilen "Tabellenüberschriften", die für mich völlig uninteressant sind.
Wie es genau aussieht: Anhang anzeigen model-list.txt.

Was ich brauche wäre eine Liste der Einträge der ersten Spalte, die ich z.B. in einer Schleife weiterverarbeiten kann.
Code:
$listOfEaModels = <hier geschieht das Wunder>
foreach ($eaModel in $listOfEaModels)
{
    echo "Creating backup for of EA model: $eaModel"
}

Abseits von C/C++ bin ich aufgeschmissen.
Ich weiß, dass ich mit C# Kenntnissen locker in der PowerShell arbeiten könnte, aber wie gesagt: C/C++ is meine Welt.
  • Wie durchläuft man Dateien Zeile für Zeile?
  • Wie kann ich eine Zeile wie in obigen "Codebeispiel" identifizieren und zerlegen, dass nur noch das "ea_model_xx" übrigbleibt?
    • Ein regulärer Ausdruck könnte hier evt. greifen
    • Oder evtl. eine Stringzerlegung anhand des Zeichens "|"
  • Wie speichere ich dann das "ea_model_xx" in meiner Liste?
Mit der reichlich vorhandenen Hilfe im Internet schaffe ich es einfach nicht.
 
C# Kenntnisse braucht man für powershell eigentlich nicht. Hin und wieder ist es ganz nützlich wenn man das .net framework kennt - in deinem Fall klappts aber auch wunderbar nur mit powershell.

Ich habs mal etwas ausführlicher geschrieben und auch kommentiert:
Code:
# Eingabeparameter definieren
param([string]$InputFile)

# Zeilen in array einlesen
$lines = Get-Content $InputFile

# die ersten 3 Zeilen entfernen
$lines = $lines[3..$lines.Length]

# Anmerkung: die Operatoren -match und -replace unterstützen regex

# nur Zeilen behalten die zum Pattern passen
$lines = ($lines | Where-Object { $_ -match "\s*[A-z0-9_]+\s+\|.*" })

# nur Einträge der ersten Spalte behalten
$lines | ForEach-Object { $_ -replace "\s*([A-z0-9_]+)\s+\|.*",'$1' }
Du kannst dir das ganze als Skript speichern und dann z.B. so aufrufen:
Code:
$listOfEaModels = NameDesSkripts.ps1 -InputFile "list.txt"

Oder du baust es einfach in dein eigenes Skript ein.
 
Zuletzt bearbeitet: (regex pattern leicht verbessert)
Herzlichen Dank Grantig. Das klappt wunderbar :).
Ich wühle mich jetzt mal ein bisschen durch die beiden regulären Ausdrücke, bis ich verstehe warum das funktioniert.
 
Zurück
Oben