ballos
Goto Top

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

Content-Key: 186760

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

Printed on: April 26, 2024 at 17:04 o'clock

Member: Skyemugen
Skyemugen Jun 20, 2012 updated at 12:04:37 (UTC)
Goto Top
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 face-wink 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é
Member: BalloS
BalloS Jun 20, 2012 at 12:26:56 (UTC)
Goto Top
Hi.

Danke. Aber leider funktioniert es nicht.

Er erstellt mir zwar eine neue Datei, aber diese ist leider leer.


Wenn ich das auch richtig interpretiere nimmt er nun nur die angegebenen Zeilen. Vielleicht habe ich es etwas unklar geschrieben :D

Also er soll jede Zeile der Datei nehmen. Es können unterschiedlich viele Zeilen sein. Und die Nummern sind die Stellen, wo das Komma ist.

Also in
Zeile 1 an Stelle 150,167,183,199 und 215
Zeile 2 an Stelle 150,167,183,199 und 215
Zeile 3 an Stelle 150,167,183,199 und 215

usw. Die Anzahl der Zeilen ansich ist unbekannt, da diese variiert.

Wenn sich das nur über VBA lösen lässt, nehme ich den Code dafür auch gerne (hab da nicht viel Ahnung) und müsste dann aber wissen, wie ich das aus einer Batchdatei heraus starten kann.

gruss
Ballos
Member: Skyemugen
Skyemugen Jun 20, 2012 updated at 13:40:48 (UTC)
Goto Top
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 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
Skript:
@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
Enddatei:
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
Member: TsukiSan
TsukiSan Jun 20, 2012 updated at 14:19:52 (UTC)
Goto Top
@andre,

das schreit nach einem bastla face-wink

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
Aber es wird noch nicht eine neue Datei angelegt. Bitte erst einmal testen durch einfügen entsprechender msgboxen.

Gruss
Tsuki
Member: bastla
bastla Jun 20, 2012, updated at Jun 21, 2012 at 14:04:18 (UTC)
Goto Top
Hallo Tsuki!

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  
@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:
cscript //nologo "D:\Das Script.vbs"
- es werden dann die Vorher-Nachher-Vergleiche in der Shell angezeigt ...

Grüße
bastla
Member: TsukiSan
TsukiSan Jun 20, 2012 at 22:12:48 (UTC)
Goto Top
@bastla

na, da dachte ich gestern wohl in die gleiche Richtung face-wink
Deins ist wie immer schön kompakt und übersichtlich.
Danke für den Tipp!

Viele Grüße

Tsuki
Member: BalloS
BalloS Jun 21, 2012 at 06:48:26 (UTC)
Goto Top
Das Script funktioniert :D

Vielen Dank

Das vereinfacht mir hier eine ganze Menge.