Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textfile bis Suchwort (bestehend aus Sonderzeichen) löschen

Frage Entwicklung Batch & Shell

Mitglied: smileyman

smileyman (Level 1) - Jetzt verbinden

24.05.2010, aktualisiert 22:49 Uhr, 4657 Aufrufe, 8 Kommentare

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

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

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
Mitglied: bastla
24.05.2010 um 23:38 Uhr
Hallo smileyman!

Falls es keine Einwände gegen die Verwendung eines (vom Batch selbst erzeugten) VBScripts gibt, etwa so:
01.
@echo off & setlocal 
02.
set "Suche=D:\Suche.txt" 
03.
set "Datei=D:\Druckdatei.prn" 
04.
 
05.
set "D=%Temp%\DelFromFile.vbs" 
06.
>%D%  echo Set fso=CreateObject("Scripting.FileSystemObject"):Set a=WScript.Arguments:D=fso.OpenTextFile(a(0)).ReadAll 
07.
>>%D% echo F=a(1):T=fso.OpenTextFile(F).ReadAll:If InStr(T,D)^>0 Then fso.CreateTextFile(F).Write Split(T,D)(1) 
08.
 
09.
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
Bitte warten ..
Mitglied: smileyman
25.05.2010 um 20:34 Uhr
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
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
Bitte warten ..
Mitglied: bastla
25.05.2010 um 21:11 Uhr
Hallo smileyman!

Vielleicht nur einmal eine kurze Erkklärung zum Script - in etwas weniger komprimierter Form sähe das so aus:
01.
Set fso=CreateObject("Scripting.FileSystemObject") 'FileSystemObject für Dateizugriffe erzeugen 
02.
Set a=WScript.Arguments 'übergebenen Argumente in Array a übernehmen 
03.
D=fso.OpenTextFile(a(0)).ReadAll 'gesamten Suchstring aus der Datei lt erstem Parameter (= a(0)) in die String-Variable D einlesen 
04.
F=a(1) 'Dateipfad aus zweitem Parameter als Variable speichern 
05.
T=fso.OpenTextFile(F).ReadAll 'gesamten Inhalt der Druckdatei in die String-Variable T einlesen 
06.
'Vorkommen des Suchstrings in der Druckdatei prüfen; 
07.
'wenn enthalten, Suchstring als "Trennzeichen" verwenden, Druckdatei aufsplitten und  
08.
'nur den zweiten Teil (Index 1, da nullbasiert) in die Druckdatei zurückschreiben -  
09.
'dabei aber vorne noch den Suchstring D anfügen (da dieser als Trennzeichen verwendet wird, 
10.
'enthält Split(T,D)(0) den Text vor dem Suchstring - der Inhalt von D "verschwindet" ...) 
11.
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
Bitte warten ..
Mitglied: smileyman
25.05.2010 um 23:02 Uhr
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
Bitte warten ..
Mitglied: smileyman
26.05.2010 um 21:24 Uhr
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
Bitte warten ..
Mitglied: bastla
26.05.2010 um 21:42 Uhr
Hallo smileyman!

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

Grüße
bastla
Bitte warten ..
Mitglied: Biber
26.05.2010 um 22:17 Uhr
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()...

Grüße
Biber
Bitte warten ..
Mitglied: bastla
26.05.2010 um 22:28 Uhr
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):
01.
P = InStrRev(T,D) 
02.
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 ...
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Exchange Server
Exchange 2010 Akzeptierte Domäne löschen (4)

Frage von Rob1982 zum Thema Exchange Server ...

Exchange Server
gelöst SBS2011 - im Exchange mobile Geräte löschen (4)

Frage von MiSt zum Thema Exchange Server ...

Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...