smileyman
Goto Top

Textfile bis Suchwort (bestehend aus Sonderzeichen) löschen

Den Inhalt eines TXT-Files zu bearbeiten bringe ich noch nicht, wenn es aber um Sonderzeichen geht, beiße ich auf Granit face-sad

Hallo Zusammen,
hallo Batch-Meister,

ich versuche ein TXT-File automatisiert zu bearbeiten. Ziel ist es, alles ausgehend vom Beginn der Text-Datei bis zu einem bestimmten Suchstring zu löschen.
Problem dabei, es handelt sich bei dieser Text-Datei um einen Druckjob (prn-File), der somit jede Menge Sonderzeichen enthält. Auch der Suchstring bis zu dem alles gelöscht werden soll besteht aus Sonderzeichen, die über die CMD nicht verarbeitbar ist face-sad

Ich habe es nun mit verschiedensten Utilitys versucht (Gnu, editini, etc.) - leider bis jetzt alles ohne Erfolg. Da der Suchstring an sich ja schon aus Sonderzeichen besteht, habe ich meine Suche auf Tools fokusiert, die Ihre Befehle auch über eine Befehl-Txt-Datei annehmen und nicht auf die Übergabe der Befehle innerhalb der CMD angewiesen sind.
Auch ein Maskieren der Sonderzeichen half leider nicht.

Da die Batch an sich schon noch mehr ausführt, wäre ich gerne bei einer Batch-Datei geblieben. - Habt ihr mir da eine Idee, ein externes Tool, etc.?

Für einen Tipp wäre ich euch sehr dankbar.

smileyman

Content-Key: 143447

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

Printed on: April 23, 2024 at 21:04 o'clock

Member: bastla
bastla May 24, 2010 at 21:38:43 (UTC)
Goto Top
Hallo smileyman!

Falls es keine Einwände gegen die Verwendung eines (vom Batch selbst erzeugten) VBScripts gibt, etwa so:
@echo off & setlocal
set "Suche=D:\Suche.txt"  
set "Datei=D:\Druckdatei.prn"  

set "D=%Temp%\DelFromFile.vbs"  
>%D%  echo Set fso=CreateObject("Scripting.FileSystemObject"):Set a=WScript.Arguments:D=fso.OpenTextFile(a(0)).ReadAll  
>>%D% echo F=a(1):T=fso.OpenTextFile(F).ReadAll:If InStr(T,D)^>0 Then fso.CreateTextFile(F).Write Split(T,D)(1)

cscript //nologo %D% "%Suche%" "%Datei%"  
Hinweise:
Es wird in diesem Entwurf nicht geprüft, ob die Datei mit dem Suchtext (diese darf nur den Suchstring ohne abschließende Zeilenschaltung enthalten) bzw die Druckdatei vorhanden sind.
Soferne die Druckdatei nur Text mit Sonderzeichen enthält (also keine reine Binärdarstellung ist), sollte das Script damit zurecht kommen.
Die Druckdatei wird unmittelbar (ohne Erstellung einer Sicherungskopie) verändert - daher nur mit einer Kopie testen.
Auch der Suchstring wird gelöscht - wenn dieser erhalten bleiben soll, dann folgende Zeile 7 verwenden:
>>%D% echo F=a(1):T=fso.OpenTextFile(F).ReadAll:If InStr(T,D)^>0 Then fso.CreateTextFile(F).Write D^&Split(T,D)(1)
Grüße
bastla
Member: smileyman
smileyman May 25, 2010 at 18:34:26 (UTC)
Goto Top
Hallo bastla,

du bist mal wieder einsame Spitze!
Insgeheim hatte ich auf eine Antwort von dir gehofft. - Danke dafür.

Ja, das funktioniert mal wieder hervorragend, genau so wie ich es gesucht habe face-smile
Klar darf es auch VB-Script sein. Zwar habe ich davon keinerlei Ahnung, aber du hast das mal wieder klasse hinbekommen.
Da das Ding ein paar mal pro Tag laufen soll, habe ich das VB-Script gleich aus der Batch ausgelagert und lasse es nur noch anstarten.

Aber gib mir doch bitte noch einen Tipp, wie ich das ganze noch andersherum machen könnte: Alles beibehalten bis auf Suchtext bis Ende löschen. Das sollte doch ähnlich laufen?

Danke
smileyman
Member: bastla
bastla May 25, 2010 at 19:11:15 (UTC)
Goto Top
Hallo smileyman!

Vielleicht nur einmal eine kurze Erkklärung zum Script - in etwas weniger komprimierter Form sähe das so aus:
Set fso=CreateObject("Scripting.FileSystemObject") 'FileSystemObject für Dateizugriffe erzeugen  
Set a=WScript.Arguments 'übergebenen Argumente in Array a übernehmen  
D=fso.OpenTextFile(a(0)).ReadAll 'gesamten Suchstring aus der Datei lt erstem Parameter (= a(0)) in die String-Variable D einlesen  
F=a(1) 'Dateipfad aus zweitem Parameter als Variable speichern  
T=fso.OpenTextFile(F).ReadAll 'gesamten Inhalt der Druckdatei in die String-Variable T einlesen  
'Vorkommen des Suchstrings in der Druckdatei prüfen;  
'wenn enthalten, Suchstring als "Trennzeichen" verwenden, Druckdatei aufsplitten und   
'nur den zweiten Teil (Index 1, da nullbasiert) in die Druckdatei zurückschreiben -   
'dabei aber vorne noch den Suchstring D anfügen (da dieser als Trennzeichen verwendet wird,  
'enthält Split(T,D)(0) den Text vor dem Suchstring - der Inhalt von D "verschwindet" ...)  
If InStr(T,D)>0 Then fso.CreateTextFile(F).Write D & Split(T,D)(1)
Noch ein Hinweis: Exakter wäre es, bei "Split" mit dem zusätzlichen Argument "2" dafür zu sorgen, dass nur zwei Teile entstehen (falls der Suchstring mehrmals vorkommen sollte, wird so nur beim ersten Vorkommen getrennt) - die letzte Zeile sähe dann so aus:
If InStr(T,D)>0 Then fso.CreateTextFile(F).Write D & Split(T,D,2)(1)
Auf dieser Basis solltest Du die gewünschte Variante eigentlich selbst hinbekommen - falls nicht, sag Bescheid ...

Grüße
bastla
Member: smileyman
smileyman May 25, 2010 at 21:02:17 (UTC)
Goto Top
Hey bastla,

Danke - Verstanden.
Dank deiner Erklärung habe ich die Modifizierung selbst hinbekommen.

Ein ganz großes Dankeschön für deine Unterstützung

smileyman
Member: smileyman
smileyman May 26, 2010 at 19:24:18 (UTC)
Goto Top
Hallo bastla,

das habe ich nun auch geschafft. - Allerdings musste ich feststellen, dass ich da bei meiner Frage 'Alles beibehalten bis auf Suchtext bis Ende löschen' einen Denkfehler hatte: um das so hinzubekommen müsste ich eigentlich das Textfile von hinten durchsuchen, schließlich will ich eigentlich nur die letzten Zeichen im Textfile löschen.
Allerdings durchsuche ich mit dem von dir assoziierten Befehl ja das File von Beginn an und lösche somit dann zuviel weg.

Gib mir doch bitte noch einen Tipp, wo ich da drehen kann, oder muss ich da komplett neu ansetzen?

Danke
smileyman
Member: bastla
bastla May 26, 2010 at 19:42:01 (UTC)
Goto Top
Hallo smileyman!

Wenn Du den Dateiinhalt und den zu löschenden Teil ev etwas genauer erklärst ...

Grüße
bastla
Member: Biber
Biber May 26, 2010 at 20:17:17 (UTC)
Goto Top
Moin bastla,

Zitat von @bastla:
Wenn Du den Dateiinhalt und den zu löschenden Teil ev etwas genauer erklärst ...

Wozu? Einfach "D" (=Suchstring) und "T" (zu durchsuchenden Text) jeweils nochmal mit StrReverse() umdrehen, der Rest kann bleiben..
Ach ja, am Schluss viellecht nochmal "T" zurückdrehen mit StrReverse()... face-wink

Grüße
Biber
Member: bastla
bastla May 26, 2010 at 20:28:42 (UTC)
Goto Top
Hallo Biber!

Wozu? Weil ich mir nicht ganz sicher bin, was ich von "Alles beibehalten bis auf Suchtext bis Ende löschen" halten soll - wenn das wirklich nur heißt, den Teil von T ab dem letzten Auftreten von D zu verwerfen, genügt ein "InStrRev()" - also etwa (als Ersatz für die Zeile 11):
P = InStrRev(T,D)
If P > 0 Then fso.CreateTextFile(F).Write Left(T, P - 1)
Grüße
bastla

P.S.: Die Idee mit "StrReverse()" ist aber auch nicht ohne ... face-smile