Batch: Zeile in Textdatei finden und dann diese Zeile und die nächsten beiden Zeilen in eine neue Datei kopieren
Hallo,
in einem anderen Forum habe ich die angebliche Lösung für mein Problem gefunden, bekomme sie aber nicht wirklich zum Laufen. Anbei der Code. Warum funktioniert das nicht? Vielleicht kann es mir jemand erklären/korrigieren oder auch einfach etwas anderes generieren, das mein Problem löst?
Das Ziel ist, alle Zeilen in einer Textdatei zu finden, die mit der Zeichenfolge "GR " beginnen. Dann sollen diese Zeilen und die jeweils nächsten beiden Zeilen in die Zieldatei kopiert werden. Es soll also so aussehen:
Eingangdatei:
AB .lkjngkldfjgg
BJ lökjasfkjhf
blup ölkhsdfklsdfg
417829 k.jhdfkhg
GR lj<sdfjfjkfg
30 öljksdfjdlsdfg
HH lksffi -lajkefjfg
PL kjadfkf kjhafhafkhff
98q234hf
GR ölij<sioösf
99 r5as khsd
99 ö0293 ljsdflji
99 klaflj ojgodg
Zieldatei:
GR lj<sdfjfjkfg
30 öljksdfjdlsdfg
HH lksffi -lajkefjfg
GR ölij<sioösf
99 r5as khsd
99 ö0293 ljsdflji
Danke schon mal im Voraus.
Olaf
in einem anderen Forum habe ich die angebliche Lösung für mein Problem gefunden, bekomme sie aber nicht wirklich zum Laufen. Anbei der Code. Warum funktioniert das nicht? Vielleicht kann es mir jemand erklären/korrigieren oder auch einfach etwas anderes generieren, das mein Problem löst?
Das Ziel ist, alle Zeilen in einer Textdatei zu finden, die mit der Zeichenfolge "GR " beginnen. Dann sollen diese Zeilen und die jeweils nächsten beiden Zeilen in die Zieldatei kopiert werden. Es soll also so aussehen:
Eingangdatei:
AB .lkjngkldfjgg
BJ lökjasfkjhf
blup ölkhsdfklsdfg
417829 k.jhdfkhg
GR lj<sdfjfjkfg
30 öljksdfjdlsdfg
HH lksffi -lajkefjfg
PL kjadfkf kjhafhafkhff
98q234hf
GR ölij<sioösf
99 r5as khsd
99 ö0293 ljsdflji
99 klaflj ojgodg
Zieldatei:
GR lj<sdfjfjkfg
30 öljksdfjdlsdfg
HH lksffi -lajkefjfg
GR ölij<sioösf
99 r5as khsd
99 ö0293 ljsdflji
setlocal enabledelayedexpansion
set lines=
for /f "tokens=1* delims=" %%a in ('findstr /b "GR "^<D:\Import-Daten\test.txt') do (
set lines=!lines! %%a
)
for /f "tokens=1* delims=" %%a in ('find /i /n /v ""^<D:\Import-Daten\test.txt') do (
for %%c in (%lines%) do (
set /a z=%%c+2
for /L %%d in (%%c 1 !z!) do (
if %%a equ %%d echo %%b >> D:\Import-Daten\AlleGR.txt
)
)
)
Danke schon mal im Voraus.
Olaf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 280853
Url: https://administrator.de/contentid/280853
Ausgedruckt am: 23.11.2024 um 00:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Olaf,
prüfe bitte in welchem Zeichensatz deine Eingangsdatei vorliegt. Batch möchte ASCII/ANSI. UTF-8 und Co. werden vermutlich gar nicht erst verarbeitet.
Wenn das nicht der Grund ist, versuche folgende Alternative:
Grüße
rubberman
prüfe bitte in welchem Zeichensatz deine Eingangsdatei vorliegt. Batch möchte ASCII/ANSI. UTF-8 und Co. werden vermutlich gar nicht erst verarbeitet.
Wenn das nicht der Grund ist, versuche folgende Alternative:
@echo off &setlocal
set "inp=D:\Import-Daten\test.txt"
set "outp=D:\Import-Daten\AlleGR.txt"
setlocal EnableDelayedExpansion
set /a c=3
<"!inp!" >"!outp!" (
for /f %%i in ('type "!inp!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set "line=" &set /p "line="
if "!line:~0,3!"=="GR " set /a c=0
if !c! lss 3 (
echo(!line!
set /a c+=1
)
)
)
rubberman
Wohl eher grep
Gruß jodel32
Gruß jodel32
Zitat von @ole-objekt:
Ja, und wenn ich Linux zur Verfügung hätte, würde ich das auch so machen.
Aber wenn ich das richtig sehe, komme ich mit grep bei Windows nicht weiter.
Grep für Windows ? Kein Problem : http://gnuwin32.sourceforge.net/packages/grep.htmJa, und wenn ich Linux zur Verfügung hätte, würde ich das auch so machen.
Aber wenn ich das richtig sehe, komme ich mit grep bei Windows nicht weiter.
Powershell ebenfalls kein Problem:
[regex]::Matches((gc 'C:\datei.txt' | out-string),'(?smi)(^GR .*?[\r\n]+.*?[\r\n]+.*?)[\r\n]+').Captures | %{$_.Groups[1].Value} | set-content 'C:\out.txt'