Inhalt einer test.txt mit Inhalt einer Mapping.ini vergleichen und wenn Zeichenfolge identisch, test.txt mit Wert aus Mapping ini ersetzen
Hallo Forum,
hier wurde mir schon oft geholfen, ich hoffe das klappt diesmal auch.
Ich habe jeweils eine Datei 00001.txt fortlaufend automatisch hoch gezählt und erstellt wird.
Die Datei hat jeweils unterschiedliche Codes als Inhalt. Z.B.: xxxx|yyyy|1|4|1|6|zzzz
Die Dateistruktur ist immer gleich und besteht aus nur einer Zeile.
Ich möchte nun anhand einer Mappingtabelle (Mapping.ini) die Zeichen nach der 2. Pipe (1|4|1|6) durch einen Eintrag aus der Mappinddatei ersetzen.
Inhalt der Mapping Datei:
1|4|1|6=123456
1|4|1|5=234567
1|4|1|4=345600
usw. (ca. 200 Codes bzw. Zeilen)
Die Zeichenfolge wie "1|4|1|6" ist einzigartig und kommt in der Mapping Datei nur einmal vor.
Die BAT Datei die ich benötige soll in der "Mapping.ini" nach dem Wert "1|4|1|6" suchen der in der "00001.txt" steht und
diesen wenn gefunden durch den Wert 123456 ersetzen.
Abbruch des Programms wenn der Eintrag nicht gefunden wurde oder abbruch des restlichen Suchlaufs wenn gefunden wäre auch wichtig.
Kann mir jemand helfen?
Gruß
reinhr
hier wurde mir schon oft geholfen, ich hoffe das klappt diesmal auch.
Ich habe jeweils eine Datei 00001.txt fortlaufend automatisch hoch gezählt und erstellt wird.
Die Datei hat jeweils unterschiedliche Codes als Inhalt. Z.B.: xxxx|yyyy|1|4|1|6|zzzz
Die Dateistruktur ist immer gleich und besteht aus nur einer Zeile.
Ich möchte nun anhand einer Mappingtabelle (Mapping.ini) die Zeichen nach der 2. Pipe (1|4|1|6) durch einen Eintrag aus der Mappinddatei ersetzen.
Inhalt der Mapping Datei:
1|4|1|6=123456
1|4|1|5=234567
1|4|1|4=345600
usw. (ca. 200 Codes bzw. Zeilen)
Die Zeichenfolge wie "1|4|1|6" ist einzigartig und kommt in der Mapping Datei nur einmal vor.
Die BAT Datei die ich benötige soll in der "Mapping.ini" nach dem Wert "1|4|1|6" suchen der in der "00001.txt" steht und
diesen wenn gefunden durch den Wert 123456 ersetzen.
Abbruch des Programms wenn der Eintrag nicht gefunden wurde oder abbruch des restlichen Suchlaufs wenn gefunden wäre auch wichtig.
Kann mir jemand helfen?
Gruß
reinhr
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 128995
Url: https://administrator.de/forum/inhalt-einer-test-txt-mit-inhalt-einer-mapping-ini-vergleichen-und-wenn-zeichenfolge-identisch-test-txt-mit-128995.html
Ausgedruckt am: 22.04.2025 um 17:04 Uhr
19 Kommentare
Neuester Kommentar
Hallo reinhr!
Abgesehen davon, dass "Suchen/Ersetzen" ohnehin besser mit speziellen Tools wie "sed" oder zumindest per VBScript durchgeführt werden sollte, spricht auch die Anforderung "abbruch des restlichen Suchlaufs wenn gefunden" eher gegen eine Batch-Lösung.
Mir ist leider auch nicht ganz klar, wie der Ablauf selbst vorgesehen ist, insbesondere, ob einzig und allein der String "1|4|1|6" ersetzt werden soll oder doch für alle in der "Mapping.ini" vorkommenden Suchbegriffe Ersetzungen geplant sind. In ersterem Falle stellte sich vor allem die Frage, wie / wodurch festgelegt wird, wonach überhaupt gesucht werden soll.
Und: Wie groß ist die zu durchsuchende Textdatei? Soferne sie problemlos am Stück in den Arbeitsspeicher passt, sollte sich die Aufgabe per VBScript relativ einfach erledigen lassen.
Grüße
bastla
Abgesehen davon, dass "Suchen/Ersetzen" ohnehin besser mit speziellen Tools wie "sed" oder zumindest per VBScript durchgeführt werden sollte, spricht auch die Anforderung "abbruch des restlichen Suchlaufs wenn gefunden" eher gegen eine Batch-Lösung.
Mir ist leider auch nicht ganz klar, wie der Ablauf selbst vorgesehen ist, insbesondere, ob einzig und allein der String "1|4|1|6" ersetzt werden soll oder doch für alle in der "Mapping.ini" vorkommenden Suchbegriffe Ersetzungen geplant sind. In ersterem Falle stellte sich vor allem die Frage, wie / wodurch festgelegt wird, wonach überhaupt gesucht werden soll.
Und: Wie groß ist die zu durchsuchende Textdatei? Soferne sie problemlos am Stück in den Arbeitsspeicher passt, sollte sich die Aufgabe per VBScript relativ einfach erledigen lassen.
Grüße
bastla
Hallo reinhr!
Soferne ich das richtig herauslese, sollen in der TXT-Datei für alle Codes der Mapping-Datei Ersetzungen vorgenommen werden. In diesem Fall könnte ein VBScript etwa so aussehen:
Die Ersetzung wird "in der Datei" vorgenommen, es wird keine Sicherung erstellt. Unterstellt wird auch, dass es je Zeile in der Mapping-Datei nur ein einziges "=" (als Trennzeichen) gibt.
Grüße
bastla
Soferne ich das richtig herauslese, sollen in der TXT-Datei für alle Codes der Mapping-Datei Ersetzungen vorgenommen werden. In diesem Fall könnte ein VBScript etwa so aussehen:
File = "D:\00001.txt"
Ini = "D:\Mapping.ini"
Set fso = CreateObject("Scripting.FileSystemObject")
M = Split(fso.OpenTextFile(Ini).ReadAll, vbCrLF)
T = fso.OpenTextFile(File).ReadAll
For i = 0 To UBound(M)
R = Split(M(i), "=")
T = Replace(T, R(0), R(1))
Next
fso.CreateTextFile(File, True).Write T
Grüße
bastla
Hallo reinhr!
Bei mir wird
mit
zu
Könnte es sein, dass die Ausgangsdatei bei Dir im Unicode-Format vorliegt? In diesem Fall wären folgende Zeile 6
bzw Zeile 11
zu verwenden.
Soferne auch die "Mapping.ini" Unicode enthält, müsste Zeile 5 so aussehen:
Grüße
bastla
Bei mir wird
xxxx|yyyy|1|4|1|7|zzzz
xxxx|yyyy|1|4|1|4|zzzz
xxxx|yyyy|1|4|1|6|zzzz
xxxx|yyyy|1|4|1|2|zzzz
xxxx|yyyy|1|4|1|0|zzzz
xxxx|yyyy|1|4|1|5|zzzz
xxxx|yyyy|1|4|1|3|zzzz
xxxx|yyyy|1|4|1|9|zzzz
xxxx|yyyy|1|4|1|1|zzzz
xxxx|yyyy|1|4|1|8|zzzz
1|4|1|6=123456
1|4|1|5=234567
1|4|1|4=345600
xxxx|yyyy|1|4|1|7|zzzz
xxxx|yyyy|345600|zzzz
xxxx|yyyy|123456|zzzz
xxxx|yyyy|1|4|1|2|zzzz
xxxx|yyyy|1|4|1|0|zzzz
xxxx|yyyy|234567|zzzz
xxxx|yyyy|1|4|1|3|zzzz
xxxx|yyyy|1|4|1|9|zzzz
xxxx|yyyy|1|4|1|1|zzzz
xxxx|yyyy|1|4|1|8|zzzz
T = fso.OpenTextFile(File, 1, False, True).ReadAll
fso.CreateTextFile(File, True, True).Write T
Soferne auch die "Mapping.ini" Unicode enthält, müsste Zeile 5 so aussehen:
M = Split(fso.OpenTextFile(Ini, 1, False, True).ReadAll, vbCrLF)
Grüße
bastla
Hallo reinhr!
Ziemlich weit oben hatte ich eigentlich erwähnt, dass mein Entwurf ein VBScript ist - demzufolge bitte nicht als ".bat", sondern als ".vbs" speichern ...
Grüße
bastla
Ziemlich weit oben hatte ich eigentlich erwähnt, dass mein Entwurf ein VBScript ist - demzufolge bitte nicht als ".bat", sondern als ".vbs" speichern ...
Grüße
bastla
Hallo reinhr!
Zunächst zur Korrektur der Ersetzung (durch das Ergänzen des Such-/Ersetzungsbegriffes um die Trennzeichen sollte das Teilstring-Problem "1|3|2|1" vs "1|3|2|16" gelöst sein):
Was ich nicht verstanden habe, ist: Übrigens wäre es doch besser, wenn nur der NEUE Wert in der Datei stehen würde.
Du meinst damit ja wohl nicht, dass die gesamte Zeile durch zB "10983:7" ersetzt werden soll?
Auch die zusätzliche Anforderung der "sequenziellen" Verabeitung (und die Bedeutung der weiteren Dateien "00002.txt", etc) erschließt sich mir leider nicht - daher bitte eine ausführlichere Beschreibung dieses Problems ...
Grüße
bastla
Zunächst zur Korrektur der Ersetzung (durch das Ergänzen des Such-/Ersetzungsbegriffes um die Trennzeichen sollte das Teilstring-Problem "1|3|2|1" vs "1|3|2|16" gelöst sein):
File = "D:\00001.txt"
Ini = "D:\Mapping.ini"
Set fso = CreateObject("Scripting.FileSystemObject")
M = Split(fso.OpenTextFile(Ini).ReadAll, vbCrLF)
T = fso.OpenTextFile(File).ReadAll
For i = 0 To UBound(M)
R = Split(M(i), "=")
WScript.Echo R(0) & " --> " & R(1)
T = Replace(T, "|" & R(0) & "|", "|" & R(1) & "|")
Next
fso.CreateTextFile(File, True).Write T
Du meinst damit ja wohl nicht, dass die gesamte Zeile durch zB "10983:7" ersetzt werden soll?
Auch die zusätzliche Anforderung der "sequenziellen" Verabeitung (und die Bedeutung der weiteren Dateien "00002.txt", etc) erschließt sich mir leider nicht - daher bitte eine ausführlichere Beschreibung dieses Problems ...
Grüße
bastla
Hallo reinhr!
Um die gesamte Zeile zu ersetzen (und unter der Voraussetzung, dass jeder Suchbegriff nur einmal in der Datei vorkommen kann), könntest Du es mit folgender (ungetesteten) Version versuchen:
Um den Dateinamen variabel zu machen, kannst Du die Zeile 1 durch
ersetzen - es wird dann der Dateiname (mit Pfad) als Aufrufparameter erwartet. Per Batch ließe sich das Ganze dann etwa so steuern:
Damit werden alle der Dateimaske "D:\000*.txt" entsprechenden Dateien zur Bearbeitung an das Script übergeben.
Grüße
bastla
Um die gesamte Zeile zu ersetzen (und unter der Voraussetzung, dass jeder Suchbegriff nur einmal in der Datei vorkommen kann), könntest Du es mit folgender (ungetesteten) Version versuchen:
File = "D:\00001.txt"
Ini = "D:\Mapping.ini"
Set fso = CreateObject("Scripting.FileSystemObject")
M = Split(fso.OpenTextFile(Ini).ReadAll, vbCrLF)
T = Split(fso.OpenTextFile(File).ReadAll, vbCrLF)
For i = 0 To UBound(M)
R = Split(M(i), "=")
For j = 0 To UBound(T)
If InStr(T(j), "|" & R(0) & "|") > 0 Then
T(j) = R(1)
Exit For
End If
Next
Next
fso.CreateTextFile(File, True).Write Join(T, vbCrLF)
File = WScript.Arguments(0)
for /f "delims=" %%i in ('dir /b /a-d D:\000*.txt') do cscript //nologo D:\ReplaceScript.vbs "%%i"
Grüße
bastla
Hallo reinhr!
Etwa so:
Achtung - wenn keine Ersetzung vorgenommen werden konnte, wird die Datei kommentarlos (ohne Rückfrage) gelöscht.
Grüße
bastla
Etwa so:
File = WScript.Arguments(0)
Ini = "D:\Mapping.ini"
Set fso = CreateObject("Scripting.FileSystemObject")
M = Split(fso.OpenTextFile(Ini).ReadAll, vbCrLF)
T = Split(fso.OpenTextFile(File).ReadAll, vbCrLF)
OK = False
For i = 0 To UBound(M)
R = Split(M(i), "=")
For j = 0 To UBound(T)
If InStr(T(j), "|" & R(0) & "|") > 0 Then
T(j) = R(1)
OK = True
Exit For
End If
Next
Next
If OK Then
fso.CreateTextFile(File, True).Write Join(T, vbCrLF)
Else
fso.DeleteFile(File)
End If
Grüße
bastla