149. VBS: mehrer Wörter mit einem Script Suchen und Ersetzen

Einleitung

Im meinem Projekt zur Textverschlüsselung NoNSA verwendete ich mehrfach VB-Skripte, um jeweils einmalig einzelne Buchstabenkombinationen (Wörter) auszuwechseln. Ich benutzte dabei den replace-Befehl und die bisherigen Ansätze mehrere Wörter mit einem Skript zu ersetzen, die im Internet kursierten, veranlassten mich, dann doch lieber ein Script pro Auswechslung zu nehmen.

Dabei ist die Lösung für dieses Problem bei genauer Betrachtung relativ simpel: Ein Textdokument muss nur einmalig  geöffnet werden, der Text in einen ersten String eingelesen werden, dann dieser String mit einem Replace -Befehl ersetzt werden, wobei der veränderte Text automatisch in einem neuen String landet.

Bis dahin kann das jeder VBS-Laie und der nächste Schritt ist auch nicht schwerer und es ist unverständlich, warum der folgende Lösungsansatz bis zum heutigen Tag nicht bei den Suchmaschinen publiziert wird:

Einfach den veränderten Text im String wieder mit einem Replace-Befehl bearbeiten, den veränderten String in einen neuen String schreiben und diesen String bei zwei gewünschten Änderungen  wieder ins Textdokument schreiben. Das ist unkomplizierter und verständlicher als irgendwelche and if - Lösungen...

---

Code-Beispiel:

Um Profis nicht zu langweilen ein kleines Codebeispiel mit einem VBS und einem Textdokument. Überwiegend wurde die offizielle Nomenklatur benutzt:

Textdokument

probe.txt (wo das liegt ist egal, im VBS müssen Sie nur den Pfad anpassen):

Alle Christen kommen in den Himmel
In den Himmel kommen alle Christen


Dann ein VBS  (irgendeinName.vbs):

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 1)
strText = objFile.ReadAll
objFile.Close
wechseleins= Replace(strText, "Christen", "Atheisten")
wechselzwei= Replace(wechseleins, "Himmel", "Hölle")
wechseldrei= Replace(wechselzwei, "den", "die")
strNewText = wechseldrei

Set objFile = objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 2)
objFile.WriteLine strNewText
objFile.Close

---
Legende

Blau
: Quelltext
Rot: kompletter Pfad zum Textdokument
Grün: Anfangs- und Endstring
Orange: Zwischenstrings für drei Wechsel mit Replace-Befehl

---


Erklärung des Quellcodes Zeile für Zeile mit dem Vokabular eines intuitiven Programmierers leicht erklärt:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Eine leere Hülle zur Bearbeitung von VBS wird geöffnet

Set objFile = objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 1)

Das Textdokument wird geöffnet und der gesamte Inhalt eingelesen - eine 1 steht für lesen, einige Schwachmaten setzen hier eine vorher definierte Variable für die 1 ein - absolut unsinnig...

strText = objFile.ReadAll

Jetzt wird es spannend: Der fest definierte objFile wird mit der Ergänzung readAll als strText (der Name von strText ist im Gegenteil zum fest definierten String objFile.ReadAll ziemlich egal .) komplett eingelesen:

Zwischenstand im String strText steht der o. a. Text.

objFile.Close


Das Textdokument wird geschlossen - wir arbeiten jetzt mit dem String und später muss dann das Textdokument wieder geöffnet werden, um dann den Endstring in das Dokument zu schreiben (destruktives überschreiben - der alte ursprüngliche Text wird überschrieben...)

wechseleins= Replace(strText, "Christen", "Atheisten")

Wir definieren einen neuen String. Man hätte auch am Anfang mit Dim wechseleins dem VB-Script zuvor sagen können, dass es eine neue Variable Namens wechseleins gibt, aber das ist zutiefstes Anfängerniveau. Hinter wechseleins steht unbestritten ein Gleichheitszeichen und was hinter dem Gleichheitszeichen steht, ist  der  Inhalt des neuen Strings; nämlich  der Text  strText aus dem Textdokument.

Der Inhalt ist also der ganze Text mit der Veränderung durch den Replace Befehl, der nach fester Syntax das erste Wort gegen das zweite Wort in Anführungszeichen austauscht.

An dieser Stelle setzt dann bei vielen VB-Script-Schreibern leider die Logik aus - denn ich habe doch in wechseleins einen vollständigen String  mit dem gesamten Text  - nur die Änderungen  vom Replace-Befehl unterscheiden diesen  wechseleins-String vom strText.  Also muss ich im nächsten Schritt den wechseleins-String bearbeiten, damit die alten Änderungen nicht verloren gehen:

wechselzwei= Replace(wechseleins, "Himmel", "Hölle")

Ich schaffe also einen weiteren String mit Namen wechselzwei (Name ist Schnurzpiepegal...), der nach dem Gleichheitszeichen als wechseleins definiert ist und bei diesem bereits veränderten String wird durch den Replace-Befehl eine weitere Änderung vorgenommen.

wechseldrei= Replace(wechselzwei, "den", "die")

Beim Wechseldrei dasselbe Spiel. Nur das nun der wechselzwei-String  mit dem Replace-Befehl bearbeitet wird


strNewText = wechseldrei

Den String wechseldrei schreibe ich dann in einen neuen String. 

Ich könnte genausogut strNewText als z.b wechselzwei definieren, hätte dann aber nur zwei Änderungen im Ergebnisstring, da wechselzwei ja vorher als wechselzwei= Replace(wechseleins, "Himmel", "Hölle") definiert wurde...Klar?!

Set objFile = objFSO.OpenTextFile("C:\derPfadzumProbetetxt\probe.txt", 2)

Als nächstes wird das Textdokument zum Überschreiben geöffnet, daher die 2 am Ende, die für destruktives Überschreiben steht - der alte Inhalt des Dokumentes geht dabei verloren....

objFile.WriteLine strNewText

Eine kleine festgeschriebene Formel für den Objektinhalt, der nun strNewText beinhaltet, welches unserer Text mit den drei Änderungen ist...

objFile.Close

Nach der Bearbeitung sollte der Objektfile geschlossen werden. Ansonsten frisst das unnötige Ressourcen...


Nachtrag 02.04.2023

Das Ganze geht auch mit Suchen und Ersetzen in einem Verzeichnis mit mehreren Dokumenten:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Folder = "C:\Users\manfr\Desktop\test\textloeschenvbs"
For Each File In objFSO.GetFolder(Folder).Files
    If LCase(Right(File.Name, 4)) = ".txt"  Then
Set objFile = objFSO.OpenTextFile(File.Path, 1)
strText = objFile.ReadAll
objFile.Close
wechseleins= Replace(strText, "Christen", "Atheisten")
wechselzwei= Replace(wechseleins, "Himmel", "Hölle")
wechseldrei= Replace(wechselzwei, "den", "die")
strNewText = wechseldrei

Set objFile = objFSO.OpenTextFile(File.Path, 2)
objFile.WriteLine strNewText
objFile.Close

End If
  
Next

Hier werden mehrer Wörter mit nur einem VBS gewechselt. Sie können das VBS beliebig erweitern, indem Sie wechselvier= Replace(wechseldrei, "das","der") und strNewText=wechselvier setzen ...

Genauso können Sie html-Dateien durchsuchen: If LCase(Right(File.Name, 5)) = ".HTMLWarum eine 5? Weil Punkt h t m l fünf Zeichen sind für HTM dann wieder 4.
Meistens werden sie eine 4 gebrauchen, wie z. B. .txt, .vbs .

Das ganze ist megapraktisch, wenn man mehrere Ersetzungen in Dateien in einem Ordner durchführen will.

Ach ja, Sie können auch die Anzahl der durchsuchten Dateien leicht herausfinden:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Folder = "C:\Users\manfr\Desktop\test\textloeschenvbs"
For Each File In objFSO.GetFolder(Folder).Files
    If LCase(Right(File.Name, 4)) = ".txt"  Then
Set objFile = objFSO.OpenTextFile(File.Path, 1)
strText = objFile.ReadAll
objFile.Close
wechseleins= Replace(strText, "Christen", "Atheisten")
wechselzwei= Replace(wechseleins, "Himmel", "Hölle")
wechseldrei= Replace(wechselzwei, "den", "die")
strNewText = wechseldrei

Set objFile = objFSO.OpenTextFile(File.Path, 2)
objFile.WriteLine strNewText
objFile.Close

Dim x
x= x+1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:\Users\manfr\Desktop\test\textloeschenvbs\Protokolldatei.txt")
objFile.WriteLine(x)
objFile.Close

End If
 
Next


Selbe Datei wie vorher, nur das bei jedem Schleifendurchlauf bei einem Treffe eine Variable x (Amfang eine 1), auf die Datei aufmerksam macht, die gerade verändert wurde.  In der Protokolldatei steht also die Anzahl  der Dateien, wo eine Ersetzung stattfand - nicht etwa die Anzahl der Ersetzungen per se!Pfad ändern nicht vergessen und die Protokoll-Datei erstellt sich von selbst.


----

Nachwort zur Stringbearbeitung mit VBS

Meine Webseite ist immer bemüht, Skript-Schreibern Hilfe auf der Metaebene zu geben, damit Sie sich wiederholende Abläufe zur Lösung anderer Aufgaben, zu Nutze machen können.
Ich könnte anhand dieser oben geschilderten Bearbeitung diverse Forenfragen beantworten, weil das zu Grunde liegende Schema bei der Stringbearbeitung immer dasselbe ist:

"Schreibe den Inhalt eines Dokumentes in einen String.  Wende einen beliebigen Befehl aus dem reichhaltigen Repertoire  der VBS-Befehle auf diesen String an und schreibe das Ergebnis in einen neuen String. Bearbeite den veränderten String mit einem beliebigen neuen Befehl und vergesse nicht das Resultat in einen neuen String zu schreiben.
Wiederhole diesen Vorgang so oft Du willst. Schreibe den letzten String der Bearbeitungskette in einen neuen String und schreibe diesen destruktiv in das alte Dokument."

Der Rest ist "nur" eine Frage der Syntax. Aber wer das Grundprinzip nicht verstanden hat, wird kläglich bei vielen eigenständigen Lösungsansätzen scheitern...

Ich wünsche den VBS-Schreibern viel Erfolg...






Impressum
Datenschutz