noob-x
Goto Top

.txt datei auslesen, Text ausschneiden und in neue Datei speichern.

Hallo,

bitte um Eure Hilfe.

Ich möchte aus einer .txt Datei bestimmte Bereiche ausschneiden und in mehrere neue Dateien abspeichern.

Es handelt sich um einen Druckstrom aus einem Programm

.txt Datei ist folgendermaßen aufgebaut.

<-XxX

text
text
text

<-YyY <-XxX

text
text
text
Zwischensumme

<-YyY <-XxX

text
text
text

<-YyY <-XxX

nun sollte alles von <-XxX bis <-YyY ausgeschnitten und in einer neuen txt Datei abgespeichert werden,
ausser es steht Zwischensumme in dem Bereich, dann sollte <-YyY ignoriert werden und erst beim nächsten
oder übernächsten <-YyY ausgeschnitten werden.
Und das so oft bis die Quelldatei leer ist, welche dann auch gelöscht werden kann.

Am Anfang der Ziel Datei sollte jeweils AaA und am Ende ZzZ stehen.

Ist für mich ein großes ?, aber vermutlich für Euch Spezialisten kein Problem sowas zu machen, ich hab echt keine Ahnung wo ich anfangen oder suchen soll.
Batch oder VBS bin für alle Lösungsvorschläge offen.

Danke im Voraus

Andy

Content-ID: 218177

Url: https://administrator.de/forum/txt-datei-auslesen-text-ausschneiden-und-in-neue-datei-speichern-218177.html

Ausgedruckt am: 02.02.2025 um 05:02 Uhr

colinardo
colinardo 30.09.2013, aktualisiert am 01.10.2013 um 08:13:39 Uhr
Goto Top
Hallo Andy,
versuchs mal mit folgendem VBS-Script und überprüfe damit ob ich dich richtig verstanden habe:
(Zeile 1 den Pfad zu deiner Textdatei eintragen, und in Zeile2 den Pfad wo die neuen Dateien erstellt werden sollen)
FILEPATH = "C:\test.txt"  
FILEPATH_NEWFILES = "C:\Ausgabe"  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objText = objFSO.OpenTextFile(FILEPATH,1)
strText = objText.ReadAll
objText.Close()
counter = 1
Set myRegExp = CreateObject("vbscript.regexp")  
myRegExp.IgnoreCase = False
myRegExp.Global = True
myRegExp.Pattern = "((<-XxX[\s\S]*?Zwischensumme[\s\S]*?<-YyY[\s\S]*?<-YyY)|(<-XxX[\s\S]*?<-YyY))"  
Set myMatches = myRegExp.Execute(strText)
If myMatches.Count >= 1 Then
For Each myMatch In myMatches
	If myMatch.SubMatches.Count >= 1 Then
		Set f = objFSO.OpenTextFile(FILEPATH_NEWFILES & "\test_" & counter & ".txt",2,True)  
		strNewContent = "AaA" & vbNewLine & myMatch.SubMatches(0) & vbNewLine & "ZzZ"  
		f.Write(strNewContent)
		f.Close
		counter = counter + 1
	End If
Next
End If
'Nächste Zeile auskommentieren zum löschen der Quell-Datei  
'objFSO.DeleteFile(FILEPATH)  
Set objFSO = Nothing

getestet habe ich mit folgendem Text:

<-XxX

text
text
text
......

<-YyY <-XxX

text
text
text
Zwischensumme
......

<-YyY <-XxX

text

text
text
......

<-YyY <-XxX

text
Zwischensumme
text
text
......
<-YyY <-XxX

text
text
text
......
<-YyY

laut deiner Beschreibung sollte das Script aus diesem Text dann zwei Dateien mit folgendem Inhalt machen:

Datei 1
AaA
<-XxX

text
text
text
......

<-YyY <-XxX

text
text
text
Zwischensumme
......

<-YyY <-XxX

text

text
text
......

<-YyY
ZzZ
Datei 2
AaA
<-XxX

text
Zwischensumme
text
text
......
<-YyY <-XxX

text
text
text
......
<-YyY
ZzZ
wenn ich dich richtig verstanden habe ...
Das löschen der Quelldatei habe ich noch nicht aktiviert(Zeile 25), damit du testen kannst.

Grüße Uwe
noob-x
noob-x 01.10.2013 um 09:03:57 Uhr
Goto Top
Hi,

Danke für die schnelle Antwort, läuft aber noch nicht so wie es sein soll.

der Bereich zwischen <-XxX und <-YyY stellt ein Blatt dar, falls nun die Zwischensumme in diesem Bereich steht
ist das ein 2. Blatt welches zum 1. dazugehört und mit in die neue Datei übernommen werden soll, können aber theoretisch bis zu 100 und mehr Seiten sein die zusammengehören.

Falls keine Zwischensumme in dem Bereich zu finden ist handelt es sich um eine einseitige Rechnung.

Das ist nicht immer gleich. Mal sinds alles einseitige , mal sind ein paar mehrseitige dabei.

Das Skript von Dir funktioniert aber im großen und ganzen nur dass die Trennung noch nicht ganz passt, echt toll beim ersten Versuch schon so ein gutes Ergebnis
zu erzielen "RESPEKT" und vielen Dank nochmal.

Wäre super wenn Du mir hier mit dem Feinschliff noch etwas helfen könntest. Es können auch mehr Dateien in dem Verzeichnis sein face-smile

LG

Andy
colinardo
colinardo 01.10.2013 aktualisiert um 11:07:58 Uhr
Goto Top
Dein Wunsch sei mir Befehl face-smile
In Zeile 6 kannst du die Dateierweiterungen angeben, die im Quell-Ordner durchsucht werden soll - dies können auch mehrere sein Bsp. arrFileExtensions = Array("txt","log")
'Pfad in dem sich die Stream-Files befinden  
FILEPATH = "C:\quelle"  
'Ausgabepfad für die einzelnen Rechnungen  
OUTPUTPATH = "C:\Ziel"  
'Erweiterungen der Dateien die durchsucht werden sollen  
arrFileExtensions = Array("txt")  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set myRegExp = CreateObject("vbscript.regexp")  
myRegExp.Global = True
For Each file In objFSO.GetFolder(FILEPATH).Files
	For i = 0 To UBound(arrFileExtensions)
		If LCase(arrFileExtensions(i)) = LCase(objFSO.GetExtensionName(file.Path)) Then
			Set objText = objFSO.OpenTextFile(file.Path,1)
			strText = objText.ReadAll
			objText.Close()
			myRegExp.IgnoreCase = False
			myRegExp.Pattern = "(<-XxX[\s\S]*?<-YyY)"  
			Set myMatches = myRegExp.Execute(strText)
			If myMatches.Count >= 1 Then
				counter = 1
				strNewContent = ""  
				For Each myMatch In myMatches
					If myMatch.SubMatches.Count >= 1 Then
						myRegExp.IgnoreCase = True
						myRegExp.Pattern = "Zwischensumme"  
						If myRegExp.Test(myMatch.SubMatches(0)) Then
							strNewContent = strNewContent & myMatch.SubMatches(0)
						Else
							strNewContent = strNewContent & myMatch.SubMatches(0)
							newFilePath = OUTPUTPATH & "\" & objFSO.GetBaseName(file.Path) & "_Rechnung_" & counter & "." & objFSO.GetExtensionName(file.Path)  
							Set f = objFSO.OpenTextFile(newFilePath,2,True)	
							strNewContent = "AaA" & vbNewLine & strNewContent & vbNewLine & "ZzZ"  
							f.Write(strNewContent)
							f.Close
							strNewContent = ""  
							counter = counter + 1	
						End If
					End If
				Next
			End If
			'Nächste Zeile auskommentieren zum löschen der Quell-Datei  
			'objFSO.DeleteFile(file.Path)  
			Exit For
		End If
	Next
Next
wscript.echo "Fertig"  
Set objFSO = Nothing
Set myRegExp = Nothing

Grüße Uwe
noob-x
noob-x 01.10.2013 um 13:42:47 Uhr
Goto Top
Vielen Vielen Dank,

da spare ich mir in Zukunft Viel Zeit.

LG

Andy
noob-x
noob-x 02.10.2013 um 14:37:59 Uhr
Goto Top
Hi,

ich nochmal face-smile

was muss ich jetzt ändern wenn ich die Datei nicht löschen sondern in einem Ordner archivieren möchte ?

habs mit objFSO.MoveFile anstatt objFSO.DeleteFile versucht und den Zielordner eingegeben aber da bekomme ich immer ne Fehlermeldung.

Grüße

Andy
colinardo
colinardo 02.10.2013 um 14:58:06 Uhr
Goto Top
Zitat von @noob-x:
was muss ich jetzt ändern wenn ich die Datei nicht löschen sondern in einem Ordner archivieren möchte ?

habs mit objFSO.MoveFile anstatt objFSO.DeleteFile versucht und den Zielordner eingegeben aber da bekomme ich immer ne
Fehlermeldung.
da hat du wahrscheinlich den Zielordner nicht mit einem Backslash am Ende angegeben, so sollte die Zeile aussehen:
objFSO.MoveFile file.Path,"c:\Backup\"
Grüße Uwe