vvss
Goto Top

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

Content-Key: 86357

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

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

Member: bastla
bastla Apr 24, 2008 at 16:13:10 (UTC)
Goto Top
Hallo -vvss- und willkommen im Forum!

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
Member: vvss
vvss Apr 24, 2008 at 16:41:41 (UTC)
Goto Top
Hallo bastla,

bin nun schon eine ganze Weile hier im Forum am lesen und probieren.
BIN BEGEISTERT, was man nicht alles mit so einer Batchdatei machen kann.

Nun aber zu meinem Problem.
In einem Datensatz, also die Zeilen zwischen den KSTA's, gibt es falls vorhanden nur eine Zeile die mit KTVA beginnt.
Es gibt aber evtl. mehrere Zeilen KTVA in der gesamten Datei, aber immer nur eine zwischen den KSTA- Zeilen.
Ja, die Zeile KTVA soll immer nach der entsprechenden KSTA- Zeile geschrieben werden.
Eine Sicherungskopie der Originaldatei ist nicht notwendig.
Gegen VBScript spricht natürlich nichts.


Schon mal Danke im Voraus.
Member: bastla
bastla Apr 24, 2008 at 16:55:50 (UTC)
Goto Top
Hallo -vvss-!

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
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]
Member: vvss
vvss Apr 25, 2008 at 16:46:26 (UTC)
Goto Top
Hallo bastla,

vielen Dank für deine schnelle Antwort, dein Script funkioniert wunderbar.
Habe aber vergessen zu erwähnen das alle Dateien in einem Ordner so bearbeitet werden sollen.
Mich hat aber der Ehrgeiz gepackt und werde es mal versuchen selber zu lösen.
Ist aber gar nicht so einfach, wenn man das erste mal so ein Script vor sich hat.


Habe das mal so probiert:

Const Verzeichnis = "D:\Daten_FTP"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Ordner = fso.GetFolder(Verzeichnis)
For Each Datei In Ordner.Files
Datei = Datei.Name
WScript.Echo "Die Datei " & Datei & " wurde gefunden"
If Not fso.FileExists(Verzeichnis & "\" &Datei) Then
WScript.Echo "Die Datei " & Datei & " wurde nicht gefunden!"
WScript.Quit
End If
If fso.FileExists(Verzeichnis & "\" &Datei) Then
WScript.Echo "Die Datei " & Datei & " wurde gefunden!"
WScript.Quit
End If


Next

Kopiere ich abe den Rest deines Scriptes vor das necht, bringt er mir Fehler in der Zeile, wo Sub RecWrite steht. Macht Spaß, bin schon Stunden am probieren, komme da erstmal nicht weiter.

Brauche mal nen kleinen Tip dazu.

Danke
Member: bastla
bastla Apr 25, 2008 at 16:58:04 (UTC)
Goto Top
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 Formatting instructions in the posts)...