Zeilen in einer Textdatei verschieben
Hallo zusammen,
ich habe eine Texdatei, bei der die Zeilen wie folgt beginnen:
KSTA_
KZEI_
KPPA_
KPPA_
KPPA_
KPPA_
KUTX_
KUTX_
KSTA_
KZEI_
KPPA_
KPPA_
KTVA_
KSTA_
KZEI_
KPPA_
KPPA_
KSTA_
Dabei ist KSTA immer der Anfang eines neuen Datensatzes und alles was dazwischen ist gehört zusammen.
Die Zeilen mit KTVA können pro zusammenhängendem Datensatz vorhanden sein, müssen aber nicht.
Nun mein Problem:
Ich möchte mit einer Batchdatei ,wenn die Zeile KTVA_ vorkommt diese unter die Zeile KSTA_ des dazugehörigen Datensatzes verschieben.
Habe schon etwas mit findstr rumprobiert, es will mir aber nicht so recht gelingen.
Kann mir jemand helfen?
Danke
ich habe eine Texdatei, bei der die Zeilen wie folgt beginnen:
KSTA_
KZEI_
KPPA_
KPPA_
KPPA_
KPPA_
KUTX_
KUTX_
KSTA_
KZEI_
KPPA_
KPPA_
KTVA_
KSTA_
KZEI_
KPPA_
KPPA_
KSTA_
Dabei ist KSTA immer der Anfang eines neuen Datensatzes und alles was dazwischen ist gehört zusammen.
Die Zeilen mit KTVA können pro zusammenhängendem Datensatz vorhanden sein, müssen aber nicht.
Nun mein Problem:
Ich möchte mit einer Batchdatei ,wenn die Zeile KTVA_ vorkommt diese unter die Zeile KSTA_ des dazugehörigen Datensatzes verschieben.
Habe schon etwas mit findstr rumprobiert, es will mir aber nicht so recht gelingen.
Kann mir jemand helfen?
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 86357
Url: https://administrator.de/forum/zeilen-in-einer-textdatei-verschieben-86357.html
Ausgedruckt am: 21.05.2025 um 00:05 Uhr
5 Kommentare
Neuester Kommentar
Hallo -vvss- und willkommen im Forum!
Einige Fragen:
Grüße
bastla
Einige Fragen:
- Kann je Datensatz mehr als eine Zeile mit KTVA beginnen?
- Die mit KTVA beginnende(n) Zeile(n) soll(en) in der neuen Datei unmittelbar nach der KSTA-Zeile eingeordnet werden - richtig?
- Soll eine Sicherungskopie erstellt, bzw die neue Datei unter einem anderen Namen als die Ausgangsdatei gespeichert werden?
- Hättest Du Einwände gegen eine Lösung in VBScript?
Grüße
bastla
Hallo -vvss-!
Bitte den Dateinamen (inkl. Pfad) in der ersten Zeile anpassen.
Zur Sicherheit wird trotzdem ein Backup erstellt, aber gelöscht, wenn das Script durchgelaufen ist. Solltest Du es dennoch behalten wollen, einfach vor die entsprechende Zeile ein Apostroph setzen.
Grüße
bastla
[Edit] Zeile "DateiNeu.Close" ergänzt. [/Edit]
BIN BEGEISTERT, was man nicht alles mit so einer Batchdatei machen kann.
Geht mir auch so, aber manchmal eignet sich VBS etwas besser ...Const Datei = "D:\Daten.txt"
Const BakExt = ".bak"
Const String1 = "KSTA_"
Const String2 = "KTVA_"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(Datei) Then
WScript.Echo "Die Datei " & Datei & " wurde nicht gefunden!"
WScript.Quit
End If
Zeilen = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLF)
Bak = Datei & BakExt
If fso.FileExists(Bak) Then fso.DeleteFile(Bak)
fso.MoveFile Datei, Bak
Set DateiNeu = fso.CreateTextFile(Datei, True)
LS1 = Len(String1)
LS2 = Len(String2)
RecStartIndex = -1
S2Index = -1
U = UBound(Zeilen)
i = 0
Do While i <= U
If StrComp(String1, Left(Zeilen(i), LS1), vbTextCompare) = 0 Then
If RecStartIndex >= 0 Then RecWrite 'vorigen Satz schreiben
RecStartIndex = i
ElseIf StrComp(String2, Left(Zeilen(i), LS2), vbTextCompare) = 0 Then
S2Index = i
End If
i = i + 1
Loop
RecWrite 'letzten Satz schreiben
DateiNeu.Close
If fso.FileExists(Bak) Then fso.DeleteFile(Bak) 'Backup (=Original-Datei) löschen
Sub RecWrite
DateiNeu.WriteLine Zeilen(RecStartIndex)
If S2Index >= 0 Then DateiNeu.WriteLine Zeilen(S2Index)
For j = RecStartIndex + 1 To i - 1
If j <> S2Index Then DateiNeu.WriteLine Zeilen(j)
Next
S2Index = -1
End Sub
Zur Sicherheit wird trotzdem ein Backup erstellt, aber gelöscht, wenn das Script durchgelaufen ist. Solltest Du es dennoch behalten wollen, einfach vor die entsprechende Zeile ein Apostroph setzen.
Grüße
bastla
[Edit] Zeile "DateiNeu.Close" ergänzt. [/Edit]
Hallo -vvss--!
Vorweg eine Anmerkung zu Deinem Script: Die Prüfung auf Vorhandensein der Datei kann entfallen - wenn sie nicht vorhanden wäre, hättest Du sie nicht per Variable "Datei" zur Verfügung (die ".Files"-Aufzählung liefert ja alle Dateien des Verzeichnisses "Ordner") ...
Das Einbinden meines Entwurfes von oben scheitert daran, dass dieser aus zwei Teilen besteht, von denen nur der erste in Deine Schleife darf - Teil 2 ist das Unterprogramm ("Sub") "RecWrite", welches ich ausgelagert habe, da ich diese Funktionalität zweimal benötige (in der Schleife für alle Datensätze mit Ausnahme des letzten, und nach der Schleife nochmals, um auch diesen letzten Satz schreiben zu können).
Grüße
bastla
P.S.: Gepostete Scripts sehen besser aus, wenn sie zwischen < code>-Tags (natürlich ohne das Leerzeichen) stehen (siehe Formatierungen in den Beiträgen)...
Vorweg eine Anmerkung zu Deinem Script: Die Prüfung auf Vorhandensein der Datei kann entfallen - wenn sie nicht vorhanden wäre, hättest Du sie nicht per Variable "Datei" zur Verfügung (die ".Files"-Aufzählung liefert ja alle Dateien des Verzeichnisses "Ordner") ...
Das Einbinden meines Entwurfes von oben scheitert daran, dass dieser aus zwei Teilen besteht, von denen nur der erste in Deine Schleife darf - Teil 2 ist das Unterprogramm ("Sub") "RecWrite", welches ich ausgelagert habe, da ich diese Funktionalität zweimal benötige (in der Schleife für alle Datensätze mit Ausnahme des letzten, und nach der Schleife nochmals, um auch diesen letzten Satz schreiben zu können).
Grüße
bastla
P.S.: Gepostete Scripts sehen besser aus, wenn sie zwischen < code>-Tags (natürlich ohne das Leerzeichen) stehen (siehe Formatierungen in den Beiträgen)...