crashzero
Goto Top

Passagen-Extraktion aus einer Textdatei via Batch-CMD

Moin,

ich hänge ein wenig.
Ich habe folgendes Problem.
Ich habe eine Textdatei die 3 Zeilen enthält in folgendem Format :

(0010,0010) PN [nachname, vorname] # 18, 1 text1
(0010,0020) LO [123456] # 6, 1 text2
(0008,1030) LO [Der Text] # 10, 1 text3

Ich würde gerne via CMD-Batch die Inhalte zwischen den eckigen Klammen (nachname, vorname - 123456 - Der Text) in eine externe Textdatei ausleiten.

Die externe Textdatei sollte dann folgenden Inhalt haben :
nachname_vorname
123456
Der Text


Wobei bei dem Namen das Komma durch einen Unterstrich ersetzt werden soll und ein ev. Leerzeichen entfernt werden soll.

findstr arbeitet nur zeilenweise, glaub da komme ich nicht weiter.

Die Daten in den Klammern sind nie die gleichen, also suchen nach (Inhalt in der Klammer) funktioniert nicht, auch die Anzahl der Zeichen zwischen den eckigen Klammern sind nie gleich in der Anzahl.

Später wird aus der Kombination nachname_vorname_123456 ein Verzeichnisordner erstellt in dem dann gezielt weitere Daten abgelegt werden.

Ich danke schonmal für Infos, Feedbacks oder Anschubser ;)

Content-ID: 1602143423

Url: https://administrator.de/forum/passagen-extraktion-aus-einer-textdatei-via-batch-cmd-1602143423.html

Ausgedruckt am: 22.12.2024 um 08:12 Uhr

149569
149569 09.12.2021 aktualisiert um 16:35:26 Uhr
Goto Top
Wieso heutzutage noch Batch?
@echo off
>"D:\datei_neu.txt" (for /f "usebackq tokens=2 delims=" %%a in ("D:\datei.txt") do (  
    set "txt=%%a"  
    set "txt=!txt:, =_!"  
    echo.!txt!
))
Besser gleich die Powershell mit Regex-Power nehmen ...
Get-Content "D:\datei.txt" | %{($_ -split '[\[\]]')[1] -replace ',\s*','_'} | set-content "D:\datei_neu.txt"  
bzw. alternativ mit Select-String
Select-String "D:\datei.txt" -Pattern '\[(.*)\]' | %{$_.Matches.Groups[1].Value -replace ',\s*','_'} | Set-Content "D:\datei_neu.txt"  


Später wird aus der Kombination nachname_vorname_123456 ein Verzeichnisordner erstellt in dem dann gezielt weitere Daten abgelegt werden.
Wozu das ganze dann noch extra in eine weitere Textdatei schreiben?? Lässt sich doch direkt ohne so einen Zwischenschritt weiterverwenden, sowas hat man vielleicht 1980 gemacht aber heutzutage ehrlich gesagt Blödsinn.
Crashzero
Crashzero 09.12.2021 aktualisiert um 19:51:54 Uhr
Goto Top
Probier ich direkt morgen aus.
Der Zwischenschritt in eine Textdatei zu schreiben hat den Sinn das ich diese Daten noch für weitere Verarbeitungen brauche.
Es handelt sich hierbei um einen Dicom-Dump aus dem ich verschiedene Segmente brauche die ich wieder zu einem Gesamtsegment zusammensetze.
Damit dies einer Prüfung der Konformität stand hält, müssen Zwischenschritte „ersichtlich“ und jederzeit einsehbar sein. (Prüfbar das alle Segmente nach Dicom-Konformität zusammengesetzt wurden).
Diese Segmente werde später in ein Log geschrieben und durch ein Tool auf Konformität geprüft.
Diese Datei kann dann zusätzlich als QR (Query Retrieve) eines Dicom-Knotens genutzt werden um für eine SCU eine SOAP class ab zu rufen.
https://pydicom.github.io/pynetdicom/stable/examples/qr_get.html
Deshalb für diesen kleinen Schritt auch nur ne Batch.
In diesem Fall mit Little Endian.
Crashzero
Crashzero 10.12.2021 um 07:04:10 Uhr
Goto Top
Get-Content hat super geklappt.
Danke
Crashzero
Crashzero 10.12.2021 um 11:12:52 Uhr
Goto Top
Danke erstmal für deine Lösung via PowerShell.

Hab den Threat zu voreilig geschlossen.

Ich nutze nun :
Get-Content "daten.dat" | %{($_ -split '[\[\]]')[1] -replace ',\s*','_'} | set-content "daten_neu.dat"

Da erhalte auch die 3 Auswertungen untereinander den Nachnamen und Vornamen aber schon mit dem _ :

NACHNAME_VORNAME
123456
TEXT

Wie kann ich die Zeile erweitern um dies Ergebnis zu erhalten :

NACHNAME_VORNAME_123456_TEXT

Danke
149569
Lösung 149569 10.12.2021 aktualisiert um 11:35:18 Uhr
Goto Top
Einfach "joinen"
(Get-Content "daten.dat" | %{($_ -split '[\[\]]')[1] -replace ',\s*','_'}) -join '_' | set-content "daten_neu.dat"  
Crashzero
Crashzero 10.12.2021 um 11:48:49 Uhr
Goto Top
THX-Rennt .....