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-Key: 280853

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: rubberman
rubberman Aug 22, 2015 at 12:54:39 (UTC)
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
Member: Endoro
Endoro Aug 23, 2015 updated at 22:31:22 (UTC)
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
Mitglied: 114757
114757 Aug 23, 2015 updated at 09:28:01 (UTC)
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
Member: Endoro
Endoro Aug 23, 2015 at 22:32:11 (UTC)
Goto Top
Hey, danke dir! face-smile
Member: ole-objekt
ole-objekt Aug 24, 2015 at 14:43:06 (UTC)
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.
Mitglied: 114757
114757 Aug 24, 2015 updated at 14:54:25 (UTC)
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'