dennisss
Goto Top

Eine TXT-Datei auslesen und nach gesuchten Inhalt die Zeile in eine andere TXT-Datei einfügen

Hallo Zusammen,

habe folgendes Problem und hoffe ihr habt eine Idee.
Ich erhalte von einem Programm eine TXT-Datei zur Verfügung und muss nach dem Inhalt die Datei durchsuchen und dann die Zeilen in andere TXT-Datei speichern.

so ungefähr sieht der Inhalt der Datei aus:

PROGRAMM 0014 DATUM PERSONALNR ORT
PROGRAMM 0015 DATUM PERSONALNR ORT
PROGRAMM 0014 DATUM PERSONALNR ORT
PROGRAMM 0014 DATUM PERSONALNR ORT
PROGRAMM 0015 DATUM PERSONALNR ORT
PROGRAMM 0015 DATUM PERSONALNR ORT
PROGRAMM 0014 DATUM PERSONALNR ORT
PROGRAMM 0003 DATUM PERSONALNR ORT
PROGRAMM 0014 DATUM PERSONALNR ORT
PROGRAMM 0003 DATUM PERSONALNR ORT

usw.

Ich muss aus der Datei nach dem 0014, 0015 und 0003 suchen und die Zeilen jeweils in Verschiedene TXT-Dateien speichern.
Problem ist aber auch, dass die Zahlen 0014, 0015 und 0003 auch in der PersonalNr auftauschen könnten und die sollen nicht beachtete werden.
Nur die in der zweiten Spalte.
Am besten wäre so eine BATCH-Datei, die ich dann über Windows-Aufgabenplanung ausführen könnte.
Das Auslesen und Aufteilen muss ich dann irgendwie automatisieren und automatisch ausführen lassen.

Könnt ihr mir weiterhelfen?
Danke im Voraus!

Gruß
Dennis

Content-Key: 517580

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

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: eisbein
eisbein 22.11.2019 um 06:10:05 Uhr
Goto Top
Guten Morgen,

so ungefähr sieht der Inhalt der Datei aus

Wenn wir dir weiter helfen sollen, dann gib uns reale Daten!

Gruß
eisbein
Mitglied: 141965
141965 22.11.2019 aktualisiert um 17:56:13 Uhr
Goto Top
Powershell Einzeiler
Get-Content Datei.txt | group {[regex]::Match($_,'.*?(\d{4})').Groups[1].Value} | %{$_.Group | Set-Content "$($_.Name).txt"}  
Mitglied: Dennisss
Dennisss 22.11.2019 um 17:28:13 Uhr
Goto Top
Hi,

so sieht der Inhalt aus:

xPER 0014 20191121 00596832 Dortmund
xPER 0014 20191121 00000387 Castrop
xPER 0014 20191121 00578325 Dorstfeld
xPER 0003 20191121 00004925 Dortmund
xPER 0003 20191121 00004925 Dortmund
xPER 0003 20191121 00004925 Dortmund
xPER 0015 20191121 00412954 Bruenning
xPER 0015 20191121 00443754 Dortmund
xPER 0014 20191121 00596832 Dortmund
xPER 0015 20191121 00412954 Dortmund
xPER 0003 20191121 00503769 Bruenning

Danke!
Mitglied: Dennisss
Dennisss 22.11.2019 um 17:30:26 Uhr
Goto Top
Hi,

danke Dir.
Kannst Du mir nur kurz erörtern, was in den Schritten gemacht wird?
Bin leider kein Entwickler und Programmierer.

Danke nochmal.

Gruß
Dennis
Mitglied: 141965
141965 22.11.2019 aktualisiert um 18:06:42 Uhr
Goto Top
Get-Content Datei.txt
Wir holen uns den Inhalt der Datei als String-Array(jede Zeile ist ein Element im Array)
group {[regex]::Match($_,'.*?(\d{4})').Groups[1].Value}
Das Array leiten wir per Pipe an das CMDLet Group-Object, das anhand von Regular Expressions die ersten 4 Digits aus der Zeile als Gruppierungsmerkmal heranzieht.
Das Ergebnis ist ein Object mit jeweils den 4 Digits als Array-Element und einer Property namens Group welche die Zeilen der jeweiligen Nummer enthalten
Das Zwischenergebnis sieht dann so aus:
Count Name                      Group                                                                                                       
----- ----                      -----                                                                                                       
    4 0014                      {xPER 0014 20191121 00596832 Dortmund, xPER 0014 20191121 00000387 Castrop, xPER 0014 20191121 00578325 D...
    4 0003                      {xPER 0003 20191121 00004925 Dortmund, xPER 0003 20191121 00004925 Dortmund, xPER 0003 20191121 00004925 ...
    3 0015                      {xPER 0015 20191121 00412954 Bruenning, xPER 0015 20191121 00443754 Dortmund, xPER 0015 20191121 00412954...
%{$_.Group | Set-Content "$($_.Name).txt"}
Das Ergebnis übergeben wir an eine Foreach-Schleife (%{}) und schreiben die Zeilen der jeweiligen Nummer in eine Textdatei mit der Nummer als Dateiname und der Endung *.txt

Ergebnis sind in dem Fall 3 Textdateien mit jeweils nur den Einträgen zu dessen Nummer:

screenshot
Mitglied: Dennisss
Dennisss 23.11.2019 um 12:11:24 Uhr
Goto Top
Hi,

danke für Deine schnelle Hilfe. Werde es am Montag testen.
Hast Du auch einen Einzeiler, um die drei Dateien wieder zu einer werden zu lassen? face-smile

Vielen Dank!

Gruß
Dennis
Mitglied: 141965
141965 23.11.2019 aktualisiert um 12:22:09 Uhr
Goto Top
Was sollte das bringen? Das Ergebnis wäre gleich wie die Quelldatei außer das es sortiert untereinander steht.

Wenn wirklich nur die Datensätze 0015, 0014 und 0003 entnommen werden sollen dann geht's so
Get-Content "Datei.txt" | ?{[regex]::Match($_,'.*?(\d{4})').Groups[1].Value -in @('0014','0015','0003')} | Set-Content "zusammenfassung.txt"  
Ablage der Dateien im Beispiel im der aktuelle Ordner von dem aus das Skript ausgeführt wird, ansonsten Pfad mitgeben.
Mitglied: Dennisss
Dennisss 23.11.2019 um 12:37:46 Uhr
Goto Top
Das eine Programm (xPER) gibt die Quell-Datei aus. Die Datei muss dann von einem anderen Programm (Schnittstelle zu SAP) weiter verarbeitet werden. Die Schnittstelle erkennt aber nur eine Art von Datensatz (nur 0015, 0014 oder 0003). Daher die Aufteilung in drei Dateien.
Nach der Verarbeitung in SAP kommen die drei Dateien zurück (beinhalten dann aber nur einige Datensätze, nicht koplett identisch zu den drei Dateien vor dem Einspielen über die Schnittstelle).
Damit das xPER-Programm die Dateien wieder einspielen kann, wäre es schön, wenn es wieder nur eine Datei gäbe.
Ich hoffe, ich konnte es einigermaßen erklären.
Mitglied: 141965
141965 23.11.2019 aktualisiert um 12:46:16 Uhr
Goto Top
Zusammenfassen von Dateien ist leicht, hier z.B
alle txt Dateien eines bestimmten Ordners zusammenfassen
Get-Content "d:\Ordner\*.txt" | Set-Content "D:\merged.txt"  
Mitglied: Dennisss
Dennisss 23.11.2019 um 12:51:09 Uhr
Goto Top
Wenn ich aber wirklich nur die drei Dateien zusammenfassen will, packe ich die Namen der Dateien hinterher, statt der "*.txt" ?
Mitglied: 141965
141965 23.11.2019 aktualisiert um 12:57:11 Uhr
Goto Top
Einfach die Pfade hintereinander mit Komma getrennt schreiben, Get-Content akzeptiert hier Arrays
Get-Content -Path ("d:\0015.txt","d:\0014.txt","d:\0003.txt") | Set-Content "D:\merged.txt"  

Lesen hilft auch
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...