florianbl
Goto Top

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:


<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!

Content-Key: 149794

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

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

Member: bastla
bastla Aug 26, 2010 at 14:15:18 (UTC)
Goto Top
Hallo FlorianBl!

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)
oder, einfacher (wenn konstant "000001" zu ersetzen ist):
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
oder die angepasste Version meines Scripts im verlinkten Beitrag:
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
Grüße
bastla
Member: FlorianBl
FlorianBl Aug 26, 2010 at 14:59:08 (UTC)
Goto Top
Hallo bastla,

habe deine erste Version probiert und es klappt bestens. Vielen Dan für die Hilfe!