moni71
Goto Top

Per Batch bestimmte Zeilen einer Textdatei in eine 2. Textatei kopieren

Hallo !

Ich versuche schon eine Weile aus einer Textdatei mit sehr langen Datensätzen (ca. 840 Zeichen) bestimmte Zeilen in eine zweite Datei zu kopieren.

Es sollen nur die Zeilen in die 2. Datei geschrieben werden, die an Stelle 322 den Inhalt "02", "03" oder "91" haben. Alle anderen sollen ignoriert werden.

mein Ansatz:

@echo off

for /f %%i in (eingabedatei.txt) do (

set zeile=%%i
set vergl=%zeile:~321,2%

if "%Vergl%"=="91" echo %zeile%>>ausgabedatei.txt
if "%Vergl%"=="02" echo %zeile%>>ausgabedatei.txt
if "%Vergl%"=="03" echo %zeile%>>ausgabedatei.txt
)


Das funktioniert nicht.

In der Variable "Zeile" stehen nur die ersten 18 Zeichen der Datenzeile. (Die Textdatei enthält auch Leerzeichen innerhalb der Zeilen. Kann das damit zusammenhängen?)

In der Variable "Vergl" steht "~321,2" drin, statt der Inhalt. Das kann aber nichts mit der Textlänge zu tun haben. Zum Test habe ich es mit Postition 8 im Text versucht: Das selbe Problem.

Kann mir hier jemand weiterhelfen???? Ich habe schon die verschiedensten Foren erfolflos durchsucht.

Content-Key: 146519

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

Printed on: April 24, 2024 at 10:04 o'clock

Member: Biber
Biber Jul 08, 2010 at 13:56:40 (UTC)
Goto Top
Moin Moni71,

Ich habe schon die verschiedensten Foren erfolflos durchsucht.
Wozu das denn? Batches dekliniert doch kein anderes Forum so durch wie wir... face-wink

Du musst nochmal kurz vor den kommenden Batches mit "SetLocal /?" am CMD-Prompt recherchieren.

Da erfährst du dann ausführlicher, dass
a) mit "SetLocal" alle im Batch verwendeten Variablen als "nur für diesen Batch sichtbar" angekündigt werden
b) mit "SetLocal EnableDelayedExpansion" eine "verzögerte Variablenauflösung" ermöglicht wird, die erlaubt, Variablen innerhalb einer CMD-Befehlszeile zu setzen und zu lesen.

Dein Schnipsel würde danach sinngemäß so aussehen:
@echo off & SetLocal EnableDelayedExpansion

for /f %%i in (eingabedatei.txt) do (

set "zeile=%%i"  
set "vergl=%zeile:~321,2%"  

if "!Vergl!"=="91" echo %%i>>ausgabedatei.txt  
if "!Vergl!"=="02" echo %%i>>ausgabedatei.txt  
if "!Vergl!"=="03" echo !zeile!>>ausgabedatei.txt  
)

Bei der 1.+2. "IF !vergl!" -Anweisung habe ich mal das "%%i" ECHOen lassen -> da ist keine Schreibweise mit "!" statt "%" möglich/nötig.
Bei allen statischen Variablen, die innerhalb von IF() oder FOR()-Anweisungsklammern gesetzt werden aber schon.

Grüße
Biber
Member: Moni71
Moni71 Jul 08, 2010 at 15:05:00 (UTC)
Goto Top
Hallo Biber!

Danke für Deine schnelle Antwort.

Ich habe den Code extra über die Zwischenablage eingefügt, um Tippfehler auszuschließen.

Leider habe ich immer noch das Problem, dass die Datenzeile abgeschnitten wird (offensichtlich beim ersten Leerzeichen).
Die Textdatei hat Datensätze mit einer Länge von ca. 840 Zeichen an festen Positionen. Dazwischen sind immer wieder auch Leerzeichen (mehrere).

In der Variable "vergl" steht als Inhalt: ~321,2

Ich versteh das einfach nicht.
Dürfen etwa keine Leerzeichen in der Datenzeile sein? Oder gibt es eine maximal zulässige Länge des Datensatzes, die hier überschritten wird?
Member: bastla
bastla Jul 08, 2010 at 15:06:30 (UTC)
Goto Top
Hallo Moni71!

Damit die Zeilen trotz der Leerzeichen komplett eingelesen werden, noch die Zeile 3 auf
for /f "delims=" %%i in (eingabedatei.txt) do (
ergänzen, und die Zeile 6 sollte (im Sinne der angeführten Erklärungen) eher so aussehen:
set "vergl=!zeile:~321,2!"
Grüße
bastla
Member: Moni71
Moni71 Jul 08, 2010 at 15:21:00 (UTC)
Goto Top
Hallo bastla!

Danke für den Tip. Jetzt funktioniert es.

Liebe Grüße

Moni71