Suchen und durch Variable ersetzen
Hallo zusammen,
ich habe ganz ähnliches vor, wie hier schon einmal gefragt wurde. Doch irgendwie bringen mich die hier gezeigten Lösungen nicht ans Ziel.
(https://www.administrator.de/index.php?content=128409)
Ich habe eine Textdatei, in der ich den Wert "000001", der ca. 700 mal vorkommt ersetzen möchte. (000001, 000002, usw.)
Der genaue Ausdruck in Text sieht so aus:
Die heir gezeiten Beispiele habe ich dann ein wenig umgebaut, um meinem Ziel näher zu kommen. So in etwa siehts aus:
Grundsätzlich passiert auch schon was. In der Ausgabedatei wird der Wert dann immer durch "1" ersetzt. Leider wird die "1" aber nicht hochgezählt.
Woran kann es liegen? Wäre für einen Hinweis sehr dankbar!
Der genaue Ausdruck in Text sieht so aus:
<gp:cache id="000001" available="True" archived="False">
Die heir gezeiten Beispiele habe ich dann ein wenig umgebaut, um meinem Ziel näher zu kommen. So in etwa siehts aus:
Const StartNum = 1
Const eFile = "D:\Eingabe.Txt"
Const aFile = "D:\Ausgabe.Txt"
Const Tag1 = "<gp:cache id="
Const Tag2 = "available="
Dim RE, Fso, File, Text, Tag, i
Set RE = New RegExp: i = StartNum
Set Fso = CreateObject("Scripting.FileSystemObject")
With RE
.Global = True: .IgnoreCase = True: .Pattern = Tag1 & ".*" & Tag2
End With
Set File = Fso.OpenTextFile(eFile): Text = File.ReadAll: File.Close
For Each Tag In RE.Execute(Text)
Text = Replace(Text, Tag, Tag1 & """" & i &"""" & Tag2):
i = i + 1
Next
Set File = Fso.CreateTextFile(aFile): File.Write Text: File.Close
Grundsätzlich passiert auch schon was. In der Ausgabedatei wird der Wert dann immer durch "1" ersetzt. Leider wird die "1" aber nicht hochgezählt.
Woran kann es liegen? Wäre für einen Hinweis sehr dankbar!
Please also mark the comments that contributed to the solution of the article
Content-Key: 149794
Url: https://administrator.de/contentid/149794
Printed on: April 24, 2024 at 07:04 o'clock
2 Comments
Latest comment
Hallo FlorianBl!
Dein Ergebnis ist relativ einfach zu erklären - da Du "
... daher entweder als Zeile 23
oder, einfacher (wenn konstant "000001" zu ersetzen ist):
oder die angepasste Version meines Scripts im verlinkten Beitrag:
Grüße
bastla
Dein Ergebnis ist relativ einfach zu erklären - da Du "
Replace()
" nicht auf das jeweils erste Vorkommen des Suchstrings beschränkt hast, werden alle passenden Strings bereits beim ersten Schleifendurchlauf ersetzt (und da diese ja immer "000001" lauten, wäre RegEx gar nicht nötig) - und zwar mit dem dann gültigen Wert für i von 1; danach gibt es den ursprünglich gesuchten String nicht mehr, weshalb auch nix ersetzt werden kann ....... daher entweder als Zeile 23
Text = Replace(Text, Tag, Tag1 & """" & i & """ " & Tag2)
Const eFile = "D:\Eingabe.Txt"
Const aFile = "D:\Ausgabe.Txt"
Const Tag1 = "<gp:cache id="""
Const Tag2 = """ available="
Const OldNum = "000001"
Const StartNum = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Text = fso.OpenTextFile(eFile).ReadAll
i = StartNum
Do While InStr(Text, Tag1 & OldNum & Tag2) > 0
Text = Replace(Text, Tag1 &OldNum & Tag2, Tag1 & i & Tag2, 1, 1)
i = i + 1
Loop
fso.CreateTextFile(aFile).Write Text
Const StartNum = 1
Ein = "D:\Eingabe.Txt"
Aus = "D:\Ausgabe.Txt"
Tag1 = "<gp:cache id="""
Tag2 = """ available="
N = StartNum
Set fso = CreateObject("Scripting.FileSystemObject")
T1 = fso.OpenTextFile(Ein).ReadAll
Set rE = New RegExp
rE.Pattern = Tag1 & "(\d*)" & Tag2
rE.IgnoreCase = True
rE.Global = True
SP = 1 'Startposition im String
For Each M In rE.Execute(T1)
P = M.FirstIndex + M.Length + 1 'Endposition des die Fundstelle enthaltenden Teilstrings
'im gefundenen Teilstring (des Originaltextes) die bisherige Nummer ersetzen und zum neuen Text hinzufügen
T2 = T2 & Replace(Mid(T1, SP, P - SP), M.SubMatches(0), N, 1, 1)
N = N + 1
SP = P 'Startposition = vorige Endposition
Next
T2 = T2 & Mid(T1, SP) 'den Teil nach der letzten Fundstelle auch noch mitnehmen
fso.CreateTextFile(Aus).Write T2
bastla