1 Stelle in jeder Zeile einer Textdatei mit fester Satzlänge verändern
Hallo,
ich habe gerade das folgende Problem:
Ich habe eine Textdatei mit einer festen Satzlänge von 350 Byte. An der ersten Stelle steht immer eine "0" und ich möchte dort immer eine "2" hinhaben.
Folgendes habe ich mir bereits gebastelt:
@echo off
for /F "delims=" %%a IN (d:\test.txt) DO call :loop "%%a"
pause
exit
:loop
set input=%1
set output="2%input:~2,349%"
echo %output:~2,350%>>d:\test_2.txt
pause
goto :eof
Die Textdate ist wie folgt aufgebaut:
0123 1234 Datensatz1 Peter Müller ... (350 Byte)
0123 5678 Datensatz2 Heinz & Tom ... (350 Byte)
0123 5678 Datensatz3 Hans Mustermann ... (350 Byte)
Bis zur Ausgabe funktioniert das ganze recht gut auch die Ausgabe funktioniert meistens, ich habe nur ein kleines Problem:
Bei meinen Beispieldaten würde er Datensatz 1 und 3 richtig ausgeben und Datensatz 2 nur bis zur Hälfte, bis hinter "Heinz".
Hinter dem "&" erwartet er einen neuen Befehl und bringt eine entsprechende Fehlermeldung. Die Ausgabe würde funktionieren wenn ich nur %output% ausgeben würde, nur kann ich dann die " " " am Anfang und Ende jeder Zeile in der neuen Datei nicht gebrauchen.
Hat von Euch jemand eine Idee?
Gruß André
ich habe gerade das folgende Problem:
Ich habe eine Textdatei mit einer festen Satzlänge von 350 Byte. An der ersten Stelle steht immer eine "0" und ich möchte dort immer eine "2" hinhaben.
Folgendes habe ich mir bereits gebastelt:
@echo off
for /F "delims=" %%a IN (d:\test.txt) DO call :loop "%%a"
pause
exit
:loop
set input=%1
set output="2%input:~2,349%"
echo %output:~2,350%>>d:\test_2.txt
pause
goto :eof
Die Textdate ist wie folgt aufgebaut:
0123 1234 Datensatz1 Peter Müller ... (350 Byte)
0123 5678 Datensatz2 Heinz & Tom ... (350 Byte)
0123 5678 Datensatz3 Hans Mustermann ... (350 Byte)
Bis zur Ausgabe funktioniert das ganze recht gut auch die Ausgabe funktioniert meistens, ich habe nur ein kleines Problem:
Bei meinen Beispieldaten würde er Datensatz 1 und 3 richtig ausgeben und Datensatz 2 nur bis zur Hälfte, bis hinter "Heinz".
Hinter dem "&" erwartet er einen neuen Befehl und bringt eine entsprechende Fehlermeldung. Die Ausgabe würde funktionieren wenn ich nur %output% ausgeben würde, nur kann ich dann die " " " am Anfang und Ende jeder Zeile in der neuen Datei nicht gebrauchen.
Hat von Euch jemand eine Idee?
Gruß André
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 50576
Url: https://administrator.de/contentid/50576
Ausgedruckt am: 25.11.2024 um 06:11 Uhr
11 Kommentare
Neuester Kommentar
Na ja, da muss doch nicht gleich was professionelles her...
bei mir klappt jedenfalls mit dem obigen 3-Zeilen-Beispiel:
(steht in der Datei Dokument1.txt) vom CMD-Prompt aus:
Als "Batch" also:
Aufruf:
HTH
Biber
P.S. Ich würde natürlich vom CMD-Prompt tippen:
bei mir klappt jedenfalls mit dem obigen 3-Zeilen-Beispiel:
0123 1234 Datensatz1 Peter Müller ... (350 Byte)
0123 5678 Datensatz2 Heinz & Tom ... (350 Byte)
0123 5678 Datensatz3 Hans Mustermann ... (350 Byte)
(steht in der Datei Dokument1.txt) vom CMD-Prompt aus:
>for /f "delims=" %i in (dokument1.txt) do @set x=%i & @echo 2!x:~1,33!
2123 1234 Datensatz1 Peter Müller
2123 5678 Datensatz2 Heinz & Tom .
2123 5678 Datensatz3 Hans Musterma
-oder auch ein-
(=19:13:53 D:\temp=)
>for /f "delims=" %i in (dokument1.txt) do @set x=%i & @echo 2!x:~1!
2123 1234 Datensatz1 Peter Müller ... (350 Byte)
2123 5678 Datensatz2 Heinz & Tom ... (350 Byte)
2123 5678 Datensatz3 Hans Mustermann ... (350 Byte)
Als "Batch" also:
:: ---------snipp setz2anStelle1.bat
@echo off & setlocal enableDelayedExpansion
for /f "delims=" %%i in (%1) do @set "x=%%i" & @echo 2!x:~1!
setz2anStelle1 dokument1.txt >Zieldatei.neu
HTH
Biber
P.S. Ich würde natürlich vom CMD-Prompt tippen:
(for /f "delims=" %i in (dokument1.txt) do @set x=%i & @echo 2!x:~1!)>neudatei.txt
@Biber
Grüße
bastla
Na ja, da muss doch nicht gleich was professionelles her...
Wär's ohnehin nicht geworden, ist es jetzt aber doch ...Grüße
bastla
@bastla
aber icsat hat doch geschrieben:
Schönes Wochenende
Biber
aber icsat hat doch geschrieben:
also eigentlich nicht wirklich anspruchsvoll.
Schönes Wochenende
Biber
Moin icsat,
sorry, war gestern abend etwas in Eile, deshalb jetzt noch mal die fehlenden Infos..
Die Variablenschreibweise !var! statt %var% ist nötig bei der so genannten "verzögerten Variablenauflösung" (neudeutsch: "delayed expansion").
Bedeutet (wenn man/frau die Schnörkel weglässt) die Möglichkeit, in ein und derselben Anweisungszeile einer Variable einen Wert zuzuweisen und sofort diesen Wert zu verwenden.
Standard wäre: Der "neue" Wert ist erst in der nächsten Anweisung verwendbar.
Wenn die "delayed expansion" nicht eingestellt ist (s. o. im Batch: Setlocal EnableDelayedExpansion), dann werden !vars! nicht aufgelöst.
Das ist der Fehler, den Du vom CMD-Prompt erhältst.
Bei mir ist es defaultmäßig eingestellt über RegKey.
Siehe dazu die Hilfe "call /?" oder "Cmd /?"
Bei Deinem zweiten Versuch mit der %var%-Schreibweise passierte beim ersten Aufruf nichts sichtbares ( der SET-Befehl hat zwar funktioniert, abr die Variable war noch nicht in derselben Zeile verwendbar).
Beim zweiten Start war die Variable da... und zwar immer mit dem gleichen Wert (die drei gleichen Zeilen, die ausgegeben werden).
Probier es bitte also mal mit dem Bätschelchen - da steht explizit "EnableDelayedExpansion" drin.
Dann schau'n wir mal.
Gruß
Biber
Der Batch allerdings sollte bei Dir as is laufen.
sorry, war gestern abend etwas in Eile, deshalb jetzt noch mal die fehlenden Infos..
Die Variablenschreibweise !var! statt %var% ist nötig bei der so genannten "verzögerten Variablenauflösung" (neudeutsch: "delayed expansion").
Bedeutet (wenn man/frau die Schnörkel weglässt) die Möglichkeit, in ein und derselben Anweisungszeile einer Variable einen Wert zuzuweisen und sofort diesen Wert zu verwenden.
Standard wäre: Der "neue" Wert ist erst in der nächsten Anweisung verwendbar.
Wenn die "delayed expansion" nicht eingestellt ist (s. o. im Batch: Setlocal EnableDelayedExpansion), dann werden !vars! nicht aufgelöst.
Das ist der Fehler, den Du vom CMD-Prompt erhältst.
Bei mir ist es defaultmäßig eingestellt über RegKey.
Siehe dazu die Hilfe "call /?" oder "Cmd /?"
Bei Deinem zweiten Versuch mit der %var%-Schreibweise passierte beim ersten Aufruf nichts sichtbares ( der SET-Befehl hat zwar funktioniert, abr die Variable war noch nicht in derselben Zeile verwendbar).
Beim zweiten Start war die Variable da... und zwar immer mit dem gleichen Wert (die drei gleichen Zeilen, die ausgegeben werden).
Probier es bitte also mal mit dem Bätschelchen - da steht explizit "EnableDelayedExpansion" drin.
Dann schau'n wir mal.
Gruß
Biber
Der Batch allerdings sollte bei Dir as is laufen.
Moin André,
Auch Deine Variante würde vermutlich laufen ohne die DelayedExpansion-Aktivierung, wenn Du
(hab ich nicht ausprobiert, dazu hast Du die geeigneteren Testdaten).
Die Variablen-Ummuddelei des M$-CMD-Interpreters kommt jedenfalls gern ans Ende ihrer Fähigkeiten, wenn Anführungszeichen UND Leerzeichen UND Steuerzeichen in einer Variablen enthalten sind.
Lässt sich an anderer Stelle als Feature nutzen, aber in Deinem Fall verursachte es halt einen Klemmer.
Wenn die Info so für Dich ausreichend war, bitte den Beitrag als "erledigt" abhaken.
Wenn nicht, dann natürlich weiter fragen.
Grüsse
Biber
Auch Deine Variante würde vermutlich laufen ohne die DelayedExpansion-Aktivierung, wenn Du
set output="2%input:~2,349%"
...änderst in..set "output=2%input:~2,349%"
(hab ich nicht ausprobiert, dazu hast Du die geeigneteren Testdaten).
Die Variablen-Ummuddelei des M$-CMD-Interpreters kommt jedenfalls gern ans Ende ihrer Fähigkeiten, wenn Anführungszeichen UND Leerzeichen UND Steuerzeichen in einer Variablen enthalten sind.
Lässt sich an anderer Stelle als Feature nutzen, aber in Deinem Fall verursachte es halt einen Klemmer.
Wenn die Info so für Dich ausreichend war, bitte den Beitrag als "erledigt" abhaken.
Wenn nicht, dann natürlich weiter fragen.
Grüsse
Biber
Moin icsat,
Und muss sagen: Deine Variante sieht genauso aus, wie sie eigentlich funktionieren müsste.
Meine Variante dürfte eigentlich gar nicht fliegen....
Wunderwelt Windows.....
Grüße
Biber
ich glaube nicht, ich hatte schon diverse "-Varianten ausprobiert.
Naja egal jetzt, es funktioniert ja.
Tja, ich habe es tatsächlich am Wochenende nochmal angeschaut...Naja egal jetzt, es funktioniert ja.
Und muss sagen: Deine Variante sieht genauso aus, wie sie eigentlich funktionieren müsste.
Meine Variante dürfte eigentlich gar nicht fliegen....
Wunderwelt Windows.....
Grüße
Biber