franz-josef-ii
Goto Top

Zusammenführen von Textdateien

Guten Morgen

Ich bin gerade dabei meine Hardware zu inventarisieren und eine entsprechende Liste zu generieren.

Ausgang: Ich bekomme zwei Listen, eine Seriennummer.txt und eine Inventarnummer.txt.

In der ersten Liste gibt es zeilenweise:
PC-Name=PC1.test.de
SerienNummer:AA11
(Leerzeile)
PC-Name=PC2.test.de
SerienNummer:AA12
(Leerzeile)
etc

In der zweiten Liste gibt es:
Host:PC1.test.de
Inventurnummer: 0001
(Leerzeile)
Host:PC2.test.de
Inventurnummer:0002
etc

Es kann natürlich auch passieren, daß manche Felder leer sind, Seriennummer konnte nicht ausgelesen werden, Inventurnummer wurde (noch) nicht eingetragen.

Ich habe jetzt einmal die Bezeichnungen (PC-Name und Host) auf Host vereinheitlicht (Danke an das Forum face-wink Suchen ersetzen per batch in einer TXT ), nur jetzt stehe ich an.

Ich möchte die beiden Dateien zusammenführen. Es soll also die Inventarnummer unterhalb der richtigen Seriennummer stehen, also

Host=PC1.test.de
SerienNummer=AA11
Inventarnummer=0001

Host=PC2.test.de
SerienNummer=AA12
Inventarnummer=0002

etc

Sollte etwas unbekannt sein, dann sollte der rechte Teil leer sein, also:

Host=PC3.test.de
SerienNummer=
Inventarnummer=0003

oder

Host=PC4.test.de
SerienNummer=AA34
Inventarnummer=


Ganz optimal wäre es, wenn ich eine Tabelle herausbekomme face-wink


Host..............SerienNummer....Inventarnummer
PC1.test.de...AA11................. 0001
PC2.test.de...AA12..................0002
PC3.test.de.............................0003
PC4.test.de...AA34


Aber die Textdatei würde genügen, möglicherweise wäre das andere einfacher face-wink

Danke für Tipps, Links zu Anleitungen und Erklärungen (man möchte ja verstehen was was tut)

Franz

Content-Key: 301031

Url: https://administrator.de/contentid/301031

Printed on: April 18, 2024 at 08:04 o'clock

Member: colinardo
Solution colinardo Apr 06, 2016 updated at 10:06:21 (UTC)
Goto Top
Hallo Franz,
hier ein Powershell-Skript was das erledigt. Die Ausgabe erfolgt wie gewünscht in eine CSV-Datei mit Spalten.
(Kommentare stehen im Code zu jeder Codezeile)
# ---- Variablen bitte anpassen ---
# Pfad der Liste 1
$path1 = 'C:\Liste1.txt'  
# Pfad der Liste 2
$path2 = 'C:\Liste2.txt'  
# Ausgabepfad der Zusammenfassungsdatei
$mergepath = 'C:\merged_list.csv'  
# ---------
# Liste der Computer und dereen Seriennummer per Regular Expression Group-Matching aus der ersten Datei extrahieren
# und über die Anzahl der Gruppen mit einer Schleife itterieren
[regex]::matches((gc $path1 | out-string),'(?ism)^PC-Name=([^\r\n]+)\s+^Seriennummer=([^\r\n]*)') | select -Expand Captures | %{  
    # Group-Matches aus dem Regex-Match Variablen zuweisen und eventuelle führende oder abschließende Leerzeichen entfernen
    # Hostname
    $hostname = $_.Groups[1].Value.trim()
    # Seriennummer
    $sn = $_.Groups[2].Value.trim()
    # Inventarnummer in der zweiten Datei anhand des Hostnamens suchen und die Inventarnummer ebenfalls per Group-Matching auslesen
    $inventarnummer = [regex]::match((gc $path2 | out-string),"(?ism)^Host=$([regex]::Escape($hostname)).*?^Inventarnummer=([^\r\n]*)") | select -Expand Groups | select -Index 1 | %{$_.Value.Trim()}  
    # Powershell-Objekt mit den Daten erstellen und ausgeben
    new-object PSObject -Property @{Host=$hostname;Seriennummer=$sn;Inventarnummer=$inventarnummer}
} | select Host,Seriennummer,Inventarnummer | export-csv $mergepath -Delimiter ";" -NoType -Encoding UTF8  

Als Beispieldaten habe ich laut deinen Angaben verwendet:

back-to-topfür Liste1.txt
PC-Name=PC1.test.de
SerienNummer=AA11

PC-Name=PC3.test.de
SerienNummer=AA13

PC-Name=PC2.test.de
SerienNummer=AA12
back-to-topfür Liste2.txt
Host=PC1.test.de
Inventarnummer=0001

Host=PC3.test.de
Inventarnummer=1233

Host=PC2.test.de
Inventarnummer=0002

Das Ergebnis sieht als CSV dann so aus:
"Host";"Seriennummer";"Inventarnummer"
"PC1.test.de";"AA11";"0001"
"PC3.test.de";"AA13";"1233"
"PC2.test.de";"AA12";"0002"
Möchte man die Liste noch nach einer Spalte sortieren, auch das ist mit minimaler Ergänzung möglich in dem man ein Sort-Object 'Spaltenname' vor die Ausgabe in die Pipe schiebt.

Grüße Uwe
Member: Franz-Josef-II
Franz-Josef-II Apr 06, 2016 at 09:55:45 (UTC)
Goto Top
Uwe

Herzlichen Dank

Ich bin gerade beim Testen, geht aber nicht, es wird nur eine leere Datei erzeugt.

Frage: Kann dies damit zusammenhängen, daß die Beispieldaten als Trenner den Doppelpunkt haben? Bei mir ist überall ein "="


Danke nocjhmal

Franz
Member: colinardo
colinardo Apr 06, 2016 updated at 10:03:58 (UTC)
Goto Top
Ja sicher, ich habe ja nur deine Angaben hier im Forum und daran halte ich mich natürlich! Wenn der Inhalt bei dir dann anders ist, ist es klar das es nicht funktioniert. Dann musst du im Regex den Doppelpunkt durch das Gleichheitszeichen austauschen.
Mit deinen erstmalig geposteten Daten funktioniert es jedenfalls einwandfrei.

Grüße Uwe
Member: colinardo
colinardo Apr 06, 2016 updated at 10:07:40 (UTC)
Goto Top
Frage: Kann dies damit zusammenhängen, daß die Beispieldaten als Trenner den Doppelpunkt haben? Bei mir ist überall ein "="
Hast deine Daten nachträglich verändert ??? Da waren nämlich vorher Doppelpunkte in deinem Posting ...!

Naja ist ja wurscht, habe es oben nun mal für die Verwendung von Gleichheitszeichen angepasst.
Member: Franz-Josef-II
Franz-Josef-II Apr 07, 2016 at 07:02:00 (UTC)
Goto Top
Ne, habe ich nicht.


Aber es funktioniert jetzt tadellos, herzlichen Dank nochmal.


Trotzdem kurz nachgefragt:
Kennst Du eine WebSite wo konkret diese Powershellanwendungen (für Anfänger verständlich) erklärt werden? Ich habe zwar jetzt Dein funktionierendes Script, einiges verstehe ich, jedoch nicht alles.

Franz
Member: colinardo
colinardo Apr 07, 2016, updated at May 29, 2019 at 10:13:40 (UTC)
Goto Top
Die Essenz besteht aus Regular Expressions, wenn du diese Technik beherrschst kannst du sie in jeder Programmiersprache zum Extrahieren und Finden von beliebig komplexen Textstellen einsetzen.
Die sind zwar nicht an einem Tag gelernt, aber wenn du mal den Dreh raus hast willst du nicht mehr ohne sie auskommen. Diese setzte ich fast täglich in meinen Skripten ein, es lohnt sich also definitiv sich die Regex-Syntax anzueignen.

Ein Einstiger-Tutorial dazu findest du z.B. hier
Regular Expressions Tutorial

Diese sind die ganze Magie hinter dem Skript.

Der Rest sind Standard-Powershell Techniken die man mit der Zeit so lernt um wie hier z.B. Daten für einen CSV-Export aufzubereiten.

Wenn du Zeit und Lust hast kann ich dir das Skript gerne auch noch mal in einem Teamviewer-Meeting näher erläutern wenn du willst, das geht um einiges schneller.