ole-objekt
Goto Top

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


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

Content-ID: 280853

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

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

rubberman
rubberman 22.08.2015 um 14:54:39 Uhr
Goto Top
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:
@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
    )
  )
)
Grüße
rubberman
Endoro
Endoro 23.08.2015, aktualisiert am 24.08.2015 um 00:31:22 Uhr
Goto Top
Hey,
Das ist ein klassischer grep-Job:
>"output.txt" grep -A 2 "^GR" "input.txt"  
Auch das funktioniert nur mit 1-Byte-Code und nicht mit UTF-8/16/...
Gruß, Endoro
114757
114757 23.08.2015 aktualisiert um 11:28:01 Uhr
Goto Top
Zitat von @Endoro:
Das ist ein klassischer greb-Job:
>"output.txt" greb -A 2 "^GR" "input.txt"
Wohl eher grep face-smile

Gruß jodel32
Endoro
Endoro 24.08.2015 um 00:32:11 Uhr
Goto Top
Hey, danke dir! face-smile
ole-objekt
ole-objekt 24.08.2015 um 16:43:06 Uhr
Goto Top
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. face-sad
Danke trotzdem für die Anregung.
114757
114757 24.08.2015 aktualisiert um 16:54:25 Uhr
Goto Top
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. face-sad
Grep für Windows ? Kein Problem : http://gnuwin32.sourceforge.net/packages/grep.htm

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'