PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VBS (Text suchen/ersetzen)


Pyrotech
01.05.2008, 17:07
Hallö,

mit dem folgenden Code (von Firefall) kann man jedes Wort (MUSTER) in der Text-Datei (test.txt) löschen.

1) Wie sähe der Code aus, wenn ich das Wort „MUSTER“ durch „BEISPIEL“ ersetzen möchte?

2) Kann man Zeilenumbrüche, Leerzeichen, Tabs, .. auch ersetzen lassen?

strFilename = "test.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strFilename)
intFileSize = objFile.Size
Set objFile = objFile.OpenAsTextStream()
strFileContent = objFile.Read(intFileSize)
objFile.Close

Set objRegExp = New RegExp
objRegExp.Pattern = Chr(34)
objRegExp.Global = True
objRegExp.IgnoreCase = True 'False für case-sensitive
strFileContent = objRegExp.Replace(strFileContent, "")
objRegExp.Pattern = "MUSTER"
strFileContent = objRegExp.Replace(strFileContent, "")
Set objFile = objFSO.OpenTextFile(strFilename, 2)
objFile.Write strFileContent
objFile.Close

Vielen Dank für Eure Hilfe.

Dankbare Grüße

Pyrotech


Firefall
01.05.2008, 18:20
Die wichtige Zeile ist
objRegExp.Replace(strFileContent, "") "" ist ein leerer Text, daher wird Muster gelöscht. Wenn du
objRegExp.Replace(strFileContent, "BEISPIEL")verwendest, wird Muster mit Beispiel ersetzt. Es gehem auch viel kompliziertere Ersetzvorgänge (z.B. bei jeder 4-stelligen Nummer die Ziffern verdoppeln oder so was krankes :D).
Hast du den Code 1:1 kopiert? Einiges davon erscheint mir nicht so, als hätte ich es geschrieben.

Pyrotech
01.05.2008, 19:35
Hi Firefall,

klasse, Problem gelöst!!!
Mille Dank für die schnelle Hilfe ... :) :) :)

War der Ansicht den Code -grübel- von Dir geklaut zu haben. :D
Ich habe wirklich viele Foren nach dieser (simplen?) Text-durchsuchen-"und-ersetzen"-Funktion durchsucht. Mir gingen schon die Suchbegriffe aus ...

Question:
Weißt Du ob/wie ich anhand eines VB-Scripts in einer größeren Text-Datei (bigone.csv/ca. 42000 Zeilen) ab der 3.000 Zeile den restlichen Text in eine 2. (neue) Datei packen kann? (Bspw. bigone1.csv)

Optimal wäre natürlich, wenn es dann immer so weiterginge (bigone2.csv .. bigone3.csv .. bigone14.csv) und (Wunschkonzert) auch noch die erste Zeile (mit den Feldnamen aus der bigone.csv) in die erste Zeile der folgenden Dateien kopiert würde.

Also quasi wie ein CSV-Splitter... :cool:
Habe zwar so ein Prog, doch dieses Tool macht bei mir bei großen Dateien (ab zig MB) leider schlapp ... :mauer: Mit VBS wäre das womöglich kein Problem, oder?

Ansonsten danke nochmal .. habe mir echt nen Ast abgesucht .. ^^

Viele Grüße

Pyrotech

Firefall
01.05.2008, 19:53
Hi Firefall,

klasse, Problem gelöst!!!
Mille Dank für die schnelle Hilfe ... :) :) :)

War der Ansicht den Code -grübel- von Dir geklaut zu haben. :D
Ich habe wirklich viele Foren nach dieser (simplen?) Text-durchsuchen-"und-ersetzen"-Funktion durchsucht. Mir gingen schon die Suchbegriffe aus ...
Ja, sieht sonst schon nach meinem Coding-Stil aus, aber du hast was daran modifiziert :D
Question:
Weißt Du ob/wie ich anhand eines VB-Scripts in einer größeren Text-Datei (bigone.csv/ca. 42000 Zeilen) ab der 3.000 Zeile den restlichen Text in eine 2. (neue) Datei packen kann? (Bspw. bigone1.csv)

Optimal wäre natürlich, wenn es dann immer so weiterginge (bigone2.csv .. bigone3.csv .. bigone14.csv) und (Wunschkonzert) auch noch die erste Zeile (mit den Feldnamen aus der bigone.csv) in die erste Zeile der folgenden Dateien kopiert würde.

Also quasi wie ein CSV-Splitter... :cool:
Habe zwar so ein Prog, doch dieses Tool macht bei mir bei großen Dateien (ab zig MB) leider schlapp ... :mauer: Mit VBS wäre das womöglich kein Problem, oder?

Ansonsten danke nochmal .. habe mir echt nen Ast abgesucht .. ^^

Viele Grüße

Pyrotech
Das ist schon möglich. Das Programm HJSplit kann dir z.B. eine Datei in mehrere gleich grosse splitten. Solltest du mit Google finden. Weiss leider nicht, wie CSV Dateien aussehen. Wenn da jede Zeile ne andere Länge hat, wie ich annehme, geht das natürlich nicht. Wenn du willst, schreib ich dir kurz einen Source dafür.

Pyrotech
01.05.2008, 22:00
Ja, sieht sonst schon nach meinem Coding-Stil aus, aber du hast was daran modifiziert :D

Das ist schon möglich. Das Programm HJSplit kann dir z.B. eine Datei in mehrere gleich grosse splitten. Solltest du mit Google finden. Weiss leider nicht, wie CSV Dateien aussehen. Wenn da jede Zeile ne andere Länge hat, wie ich annehme, geht das natürlich nicht. Wenn du willst, schreib ich dir kurz einen Source dafür.

Hi Firefall,

HJSplit ist ein kleines aber feines Tool. ;)
Doch jede Zeile ist leider -wie Du schon richtig vermutest- unterschiedlich lang... :(

Feld1;Feld2;Feld3;Feld4;Feld5
Datensatz1a;Datensatz1b;Datensatz1c;Datensatz1d;Datensatz1e
Datensatz2a;Daten-Satz2b;Daten-Satz2c;Datensatz2d;Datensatz2e
Datensatz3a;Datensatz3b;Datensatz3c;Daten-Satz3d;Datensatz3e

Wenn Du Dir die Mühe (sprich den SC) für mich coden (nennt man das so?) würdest, wäre ich Dir unendlich dankbar. :cool: :cool: :cool:

Einfach nur top !!!

Viele 'dankbare' Grüße

Pyrotech

Firefall
01.05.2008, 23:21
Hi Firefall,

HJSplit ist ein kleines aber feines Tool. ;)
Doch jede Zeile ist leider -wie Du schon richtig vermutest- unterschiedlich lang... :(

Feld1;Feld2;Feld3;Feld4;Feld5
Datensatz1a;Datensatz1b;Datensatz1c;Datensatz1d;Datensatz1e
Datensatz2a;Daten-Satz2b;Daten-Satz2c;Datensatz2d;Datensatz2e
Datensatz3a;Datensatz3b;Datensatz3c;Daten-Satz3d;Datensatz3e

Wenn Du Dir die Mühe (sprich den SC) für mich coden (nennt man das so?) würdest, wäre ich Dir unendlich dankbar. :cool: :cool: :cool:

Einfach nur top !!!

Viele 'dankbare' Grüße

PyrotechBitte sehr:
strFilename = "test.txt"
intLinesPerFile = 3000
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objInputFile = objFSO.OpenTextFile(strFileName)

intLinesRead = 0
intFileIndex = 1

Set objOutputFile = objFSO.CreateTextFile(objFSO.GetBaseName(strFilename) & intFileIndex & "." & objFSO.GetExtensionName(strFilename))
Do Until objInputFile.AtEndOfStream
objOutputFile.WriteLine objInputFile.ReadLine
intLinesRead = intLinesRead + 1
If intLinesRead = intLinesPerFile Then
objOutputFile.Close
intFileIndex = intFileIndex + 1
Set objOutputFile = objFSO.CreateTextFile(objFSO.GetBaseName(strFilename) & intFileIndex & "." & objFSO.GetExtensionName(strFilename))
intLinesRead = 0
End If
Loop
objOutputFile.Close
objInputFile.Close
MsgBox "Done."

Pyrotech
02.05.2008, 17:27
Hi Firefall,

:cool: :D :cool:

Muchas gracias für Deine Hilfe.

Oliver

Firefall
02.05.2008, 19:44
Hi Firefall,

:cool: :D :cool:

Muchas gracias für Deine Hilfe.

Oliver
Gern geschehen ;)

danrei
20.08.2008, 14:15
Hallo Firefall,

das Skript ist gut, habe leider nur ein Problem:

Ich muss eine ganze Textphrase suchen und ersetzen.

Leider beinhaltet diese "-Zeichen - das Skript wirft beim Ausführen also einen Fehler aus (Fehler: Anweisungende erwartet).

Außerdem sind in dem zu suchenden Text Zeilenumbrüche, mit denen das Skript anscheinend nicht klarkommt.

Gibt es hierzu eine Lösung? Bin leider kein wirklicher Programmierer. Kann man evtl. mit Platzhaltern wie * oder % arbeiten?

Hier ein Beispiel für den zu suchenden/zu ersetzenden Text:

Zu suchender Text:

<!-- BEGINN des zanox-affiliate HTML-Code -->
<!-- ( Der HTML-Code darf im Sinne der einwandfreien Funktionalität nicht verändert werden! ) -->
<a href="http-Link"><img src="http-Link" align="bottom" width="160" height="600" border="0" hspace="1" alt="Sortiment_Angebote_160x600"></a>
<!-- ENDE des zanox-affiliate HTML-Code -->

Zu ersetzender Text:

!-- zanox AdServer code start--
script type=textjavascript src=httpzbox.zanox.comscriptsadbox_content.js
script
script type=textjavascript
CallAdBoxTracking(252847, 985666227, 0, 120, 600, 'B0E0E6', 'FFFFFF', '000000', '336699', '333333', '0', '', true);
script
!-- zanox AdServer code end --

Vielen Dank im Voraus für die Hilfe.

danrei

Firefall
20.08.2008, 15:13
Ja, du kannst Platzhalter verwenden. Am besten verwendets du Escaping.
Anstatt " schreibst du \x22. Für einen Zeilenumbruch schreibst du \x0D\X0A.
Für den Rest musst du unbedingt wissen, das RegExp andere Platzhalter hat, als du sie kennst. * ist z.B. kein Platzhalter, sondern bewirkt lediglich, das beliebige VIELE Wiederholungen (0 oder mehr) des vorangehenden Ausdrucks kommen dürfen. a* passt also auf gar nichts, auf a, auf aa, auf aaa usw. Für das "klassische" * musst du .* beziehungsweise .*? schreiben. Ich werde vielleicht demnächst mal eine Version des Scripts mit ner GUI schreiben, das scheint ja total beliebt zu sein inzwischen.