Mit Batch Zeichen an einer bestimmten Stelle in txt Datei ersetzen
Hallo,
ich hab mal wieder ein kleines Batch Problem, wo ich irgendwie nicht einmal ein Anfang finde.
Ich erhalte immer mal wieder Txtdateien mit jeder Menge Zeilen Inhalt. Die Zeilen haben alle eine festgelegte Länge.
Nun möchte ich immer an bestimmten Stellen in jeder Zeile ein Zeichen durch ein anderes ersetzen.
Und zwar stehen immer an folgenden Stellen ein Komma:
150
167
183
199
215
Dieses Komma soll nun durch ein Punkt ersetzt werden. Wichtig ist dabei, dass Kommas an anderen Stellen davon nicht betroffen sind. Es dürfen auf keinen Fall alle Kommas durch Punkte ersetzt werden, sondern nur die an den bestimmten Stellen.
Ist dies überhaupt durch eine Batchdatei möglich ?
Da dies später in einen automatischen Ablauf integriert werden soll, fällt die Möglichkeit von einem externen Programm leider weg.
Bin für jede Hilfe und Ansatz dankbar, der mich irgendwie weiterbringt.
gruss
BalloS
ich hab mal wieder ein kleines Batch Problem, wo ich irgendwie nicht einmal ein Anfang finde.
Ich erhalte immer mal wieder Txtdateien mit jeder Menge Zeilen Inhalt. Die Zeilen haben alle eine festgelegte Länge.
Nun möchte ich immer an bestimmten Stellen in jeder Zeile ein Zeichen durch ein anderes ersetzen.
Und zwar stehen immer an folgenden Stellen ein Komma:
150
167
183
199
215
Dieses Komma soll nun durch ein Punkt ersetzt werden. Wichtig ist dabei, dass Kommas an anderen Stellen davon nicht betroffen sind. Es dürfen auf keinen Fall alle Kommas durch Punkte ersetzt werden, sondern nur die an den bestimmten Stellen.
Ist dies überhaupt durch eine Batchdatei möglich ?
Da dies später in einen automatischen Ablauf integriert werden soll, fällt die Möglichkeit von einem externen Programm leider weg.
Bin für jede Hilfe und Ansatz dankbar, der mich irgendwie weiterbringt.
gruss
BalloS
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 186760
Url: https://administrator.de/contentid/186760
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
7 Kommentare
Neuester Kommentar
Aloha,
prinzipiell machbar - theoretisch.
Praktisch dürfte es sinnvollerweise auf .VBS hinauslaufen, sollte dich das nicht stören (nein, ich selbst kann die Lösung nicht produzieren, bin immer froh, wenn ich gegebene VBS-Schnipsel verstehe und editieren kann, hehe).
Nur Geduld dafür haben wir unsere Spezialisten.
Mit batch, naja ob man es mögen will, eventuell so:
greetz André
prinzipiell machbar - theoretisch.
Praktisch dürfte es sinnvollerweise auf .VBS hinauslaufen, sollte dich das nicht stören (nein, ich selbst kann die Lösung nicht produzieren, bin immer froh, wenn ich gegebene VBS-Schnipsel verstehe und editieren kann, hehe).
Nur Geduld dafür haben wir unsere Spezialisten.
Mit batch, naja ob man es mögen will, eventuell so:
@echo off & setlocal enabledelayedexpansion
for /f "usebackq delims=" %%s in ("E:\Skripte\REUSER.txt") do (
set "zeile=%%s"
>>datei_neu.txt echo !zeile:~0,149!.!zeile:~150,16!.!zeile:~167,15!.!zeile:~183,15!.!zeile:~199,15!.!zeile:~215!
)
pause
goto :eof
greetz André
Aloha,
ja, der code nimmt JEDE Zeile, und gibt nur die Zeile bis zum angegebenen Zeichen an, dann wird manuell ein Punkt ausgegeben und wieder ein Stück der Zeile etc.
bei mir funktioniert das halb-getestet problemlos, allerdings habe ich mir nicht die Mühe gemacht, hundertezeichenlange Zeilen zu kreiren und ich weiß auch nicht wie groß deine Datei gesamt ist.
Eventuell mal Zeile eins ändern
Sonst warten wir eben doch auf bastla, TsukiSan, Friemler und wie sie alle heißen, um VBS (nicht VBA) zu brützeln, die Dinger lassen sich, wenn man unbedingt muss, auch per batch starten.
greetz André
edit: mein Beispiel sah so aus:
Testdatei:
Skript:
Enddatei:
ja, der code nimmt JEDE Zeile, und gibt nur die Zeile bis zum angegebenen Zeichen an, dann wird manuell ein Punkt ausgegeben und wieder ein Stück der Zeile etc.
bei mir funktioniert das halb-getestet problemlos, allerdings habe ich mir nicht die Mühe gemacht, hundertezeichenlange Zeilen zu kreiren und ich weiß auch nicht wie groß deine Datei gesamt ist.
Eventuell mal Zeile eins ändern
echo on
statt off
und schauen, ob sich überhaupt etwas tut.Sonst warten wir eben doch auf bastla, TsukiSan, Friemler und wie sie alle heißen, um VBS (nicht VBA) zu brützeln, die Dinger lassen sich, wenn man unbedingt muss, auch per batch starten.
greetz André
edit: mein Beispiel sah so aus:
Testdatei:
1h2b,fi5jgmsl4,skdm,2hf8s,xke,dkbl
1h2bgf,5jgmül4,skdm,2hf,snxke,dkbl
1h2bgfi5,gm|l4,skdm,2hf8,nxke,dkbl
1h2,gfi5jgm&l4,skdm,2hf8sn,ke,dkbl
@echo off & setlocal enabledelayedexpansion
for /f "usebackq delims=" %%s in ("E:\Skripte\REUSER.txt") do (
set "zeile=%%s"
>>datei_neu.txt echo !zeile:~0,14!.!zeile:~15,4!.!zeile:~20,9!.!zeile:~30!
)
pause
1h2b,fi5jgmsl4.skdm.2hf8s,xke.dkbl
1h2bgf,5jgmül4.skdm.2hf,snxke.dkbl
1h2bgfi5,gm|l4.skdm.2hf8,nxke.dkbl
1h2,gfi5jgm&l4.skdm.2hf8sn,ke.dkbl
@andre,
das schreit nach einem bastla
Mir ist auf die schnelle nur soetwas eingefallen in VBS
Aber es wird noch nicht eine neue Datei angelegt. Bitte erst einmal testen durch einfügen entsprechender msgboxen.
Gruss
Tsuki
das schreit nach einem bastla
Mir ist auf die schnelle nur soetwas eingefallen in VBS
Dim Pfad, MeineDaten
Dim FSO
Dim KOMMA, PUNKT
Stelle = Array(150, 167, 183, 199, 215)
KOMMA = ","
PUNKT = "."
Pfad = "C:\REUSER.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
MeineDaten = Split(FSO.OpenTextFile(Pfad, 1).ReadAll, vbCrLf)
For h = 0 To (UBound(MeineDaten) - 1)
temp = MeineDaten(h)
MsgBox temp 'vorher
For i = 0 To Stelle(UBound(Stelle))
Select Case i
Case Stelle(0)
temp = Left(temp, Stelle(0)) & PUNKT & Mid(temp, Stelle(0) + 2, Len(temp))
i = Stelle(1) - 1
Case Stelle(1)
temp = Left(temp, Stelle(1)) & PUNKT & Mid(temp, Stelle(1) + 2, Len(temp))
i = Stelle(2) - 1
Case Stelle(2)
temp = Left(temp, Stelle(2)) & PUNKT & Mid(temp, Stelle(2) + 2, Len(temp))
i = Stelle(3) - 1
Case Stelle(3)
temp = Left(temp, Stelle(3)) & PUNKT & Mid(temp, Stelle(3) + 2, Len(temp))
i = Stelle(4) - 1
Case Stelle(4)
temp = Left(temp, Stelle(4)) & PUNKT & Mid(temp, Stelle(4) + 2, Len(temp))
i = Stelle(UBound(Stelle))
End Select
Next
MsgBox temp 'nachher
Next
Gruss
Tsuki
Hallo Tsuki!
Hätte ich fast genauso gemacht - nur vielleicht etwas kompakter formuliert:
@BalloS
Für die Testphase ist das Überschreiben der Originaldatei mit der geänderten Version durch das Auskommentieren der letzten Zeile noch deaktiviert - um das Script "scharf" zu schalten, einfach den Apostroph am Beginn der letzten Zeile entfernen ...
... ach ja: Wenn Du nicht ganz besonders gerne oft auf "Ok" klicken magst, solltest Du das Testen in die CDM-Shell verlegen und das Script so starten:
- es werden dann die Vorher-Nachher-Vergleiche in der Shell angezeigt ...
Grüße
bastla
Hätte ich fast genauso gemacht - nur vielleicht etwas kompakter formuliert:
Stellen = Array(150, 167, 183, 199, 215)
KOMMA = ","
PUNKT = "."
Pfad = "D:\REUSER.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
MeineDaten = Split(FSO.OpenTextFile(Pfad, 1).ReadAll, vbCrLf)
For h = 0 To UBound(MeineDaten)
temp = MeineDaten(h)
WScript.Echo temp 'vorher
For Each Stelle in Stellen
If Mid(temp, Stelle, 1) = KOMMA Then temp = Left(temp, Stelle - 1) & PUNKT & Mid(temp, Stelle + 1)
Next
WScript.Echo temp 'nachher
WScript.Echo
MeineDaten(h) = temp 'Änderung zwischenspeichern
Next
'fso.CreateTextFile(Pfad).Write Join(MeineDaten, vbCrLf) 'Datei durch geänderte Version ersetzen
Für die Testphase ist das Überschreiben der Originaldatei mit der geänderten Version durch das Auskommentieren der letzten Zeile noch deaktiviert - um das Script "scharf" zu schalten, einfach den Apostroph am Beginn der letzten Zeile entfernen ...
... ach ja: Wenn Du nicht ganz besonders gerne oft auf "Ok" klicken magst, solltest Du das Testen in die CDM-Shell verlegen und das Script so starten:
cscript //nologo "D:\Das Script.vbs"
Grüße
bastla
@bastla
na, da dachte ich gestern wohl in die gleiche Richtung
Deins ist wie immer schön kompakt und übersichtlich.
Danke für den Tipp!
Viele Grüße
Tsuki
na, da dachte ich gestern wohl in die gleiche Richtung
Deins ist wie immer schön kompakt und übersichtlich.
Danke für den Tipp!
Viele Grüße
Tsuki