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
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
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
Danke für Tipps, Links zu Anleitungen und Erklärungen (man möchte ja verstehen was was tut)
Franz
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
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
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
Danke für Tipps, Links zu Anleitungen und Erklärungen (man möchte ja verstehen was was tut)
Franz
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 301031
Url: https://administrator.de/forum/zusammenfuehren-von-textdateien-301031.html
Ausgedruckt am: 09.04.2025 um 21:04 Uhr
6 Kommentare
Neuester Kommentar
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)
Als Beispieldaten habe ich laut deinen Angaben verwendet:
Das Ergebnis sieht als CSV dann so aus:
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
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:
für Liste1.txt
PC-Name=PC1.test.de
SerienNummer=AA11
PC-Name=PC3.test.de
SerienNummer=AA13
PC-Name=PC2.test.de
SerienNummer=AA12
fü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"
Grüße Uwe
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
Mit deinen erstmalig geposteten Daten funktioniert es jedenfalls einwandfrei.
Grüße Uwe
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.
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.
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.