Bestimmte Textbereiche die mehrmals in einer Textdatei vorkommen per Batch in einer Textdatei ausgeben
Hallo,
ich habe folgende Struktur in einer Textdatei.
Process start Owner1...................
Text ..............................Text........................Text................
Process end Owner1..................
Text dazwischen……………………………………………….
Process start Owner2...................
Text ..............................Text........................Text................
Process end Owner2..................
Text dazwischen……………………………………………….
Process start Owner1...................
Text ..............................Text........................Text................
Process end Owner1..................
usw.
Es müssen die Textbereiche zwischen "start" und "end" für alle im Text vorkommende Zeichenketten vom Typ "start" und "end" je nach Besitzertyp in eine Textdatei ausgegeben werden. Der Textbereich zwischen Zeichenketten vom Typ "end" und "start" (der Text dazwischen) muss ebenfalls in eine Textdatei exportiert werden. Es klappt bei mir jetzt dass für einzelne Paare "start" "end" der Textbereich exportiert wird. Sobald aber über den gesamten Textraum iteriert werden muss(in meinem Fall wäre dies verschachelte Subroutines die für jeden Schleifendurchlauf aufgerufen werden), klappt es nicht mehr. Problematisch bei diesem Ansatz ist dass auch Textbereiche zwischen "end" Phasen und "start" Phasen anderer Prozessen ausgegeben werden.
im Prinzip sind zwei Stringlisten, die miteinander korrelliert sind, und brauche von jeder Liste immer die gleiche Zeile (also Zeile 1 von SL1 und Zeile1 von SL2). So würde es funktionieren. Da ich kein Batchspezi bin, freue mich über jeden Hinweis.
dedalus2011
ich habe folgende Struktur in einer Textdatei.
Process start Owner1...................
Text ..............................Text........................Text................
Process end Owner1..................
Text dazwischen……………………………………………….
Process start Owner2...................
Text ..............................Text........................Text................
Process end Owner2..................
Text dazwischen……………………………………………….
Process start Owner1...................
Text ..............................Text........................Text................
Process end Owner1..................
usw.
Es müssen die Textbereiche zwischen "start" und "end" für alle im Text vorkommende Zeichenketten vom Typ "start" und "end" je nach Besitzertyp in eine Textdatei ausgegeben werden. Der Textbereich zwischen Zeichenketten vom Typ "end" und "start" (der Text dazwischen) muss ebenfalls in eine Textdatei exportiert werden. Es klappt bei mir jetzt dass für einzelne Paare "start" "end" der Textbereich exportiert wird. Sobald aber über den gesamten Textraum iteriert werden muss(in meinem Fall wäre dies verschachelte Subroutines die für jeden Schleifendurchlauf aufgerufen werden), klappt es nicht mehr. Problematisch bei diesem Ansatz ist dass auch Textbereiche zwischen "end" Phasen und "start" Phasen anderer Prozessen ausgegeben werden.
im Prinzip sind zwei Stringlisten, die miteinander korrelliert sind, und brauche von jeder Liste immer die gleiche Zeile (also Zeile 1 von SL1 und Zeile1 von SL2). So würde es funktionieren. Da ich kein Batchspezi bin, freue mich über jeden Hinweis.
dedalus2011
setlocal EnableDelayedExpansion
set strArrayNumber=0
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt') ^
do (set strArrayValue=%%j && call:functionArray)
goto :end
:functionArray
set /a strArrayNumber=%strArrayNumber% + 1
set strArrayName.%strArrayNumber%=%strArrayValue%
goto :eof
:end
echo FIRST %strArrayName.1%
set array1=%strArrayName.1%
:main
for /f "delims=:" %%i in ('findstr /n /c:"process start" C:\test\testdatei2.txt') ^
do @Set ZeileAb=%%i && call:subroutine1
goto :end
:subroutine1
for /f "delims=:" %%j in ('findstr /n /c:"process end" C:\test\testdatei2.txt') ^
do @Set ZeileBis=%%j && call:subroutine2
goto :eof
:subroutine2
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt') ^
do @if %ZeileBis% gtr %ZeileAb% @if %%i gtr %ZeileAb% @if %%i Lss %ZeileBis% ^
echo. %%~j >>C:\ausgabe.txt
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt') ^
do @if %ZeileBis% lss %ZeileAb% @if %%i lss %ZeileAb% @if %%i gtr %ZeileBis% ^
echo. %%~j >>C:\ausgabe2.txt
goto :eof
:end
pause
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 182899
Url: https://administrator.de/contentid/182899
Ausgedruckt am: 24.11.2024 um 09:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo dedalus2011!
Ich würde das anders anlegen und mittels einer "Schalter"-Variablen festhalten, ob die gelesene Zeile sich in einem "Process"-Block oder außerhalb davon befindet (aus Vereinfachungsgründen verwende ich als Wert des Schalters gleich den Namen der Datei, in welche im einen oder anderen Fall die Zeile geschrieben werden soll).
Sobald feststeht, welche Art von Zeile vorliegt (in "Process"-Block, Beginn "Process"-Block, Ende "Process"-Block oder "dazwischen"), kann die entsprechende Verarbeitung erfolgen - in meinem Ansatz wird auch nur bei "Process start" und "Process end" nur zwischen den Dateien "umgeschaltet" und ansonsten die Zeile in die passende Datei geschrieben:
Wenn übrigens tatsächlich nur ausgegeben werden müsste, ließen sich natürlich die beiden "Schreib-Blöcke" (ab Zeile 25 bzw 37 zusammenfassen) - ich hatte aber angenommen, dass noch ev Auswertungen vorzunehmen wären und deshalb gleich mal getrennte Verarbeitungsschritte vorgesehen ...
Grüße
bastla
Ich würde das anders anlegen und mittels einer "Schalter"-Variablen festhalten, ob die gelesene Zeile sich in einem "Process"-Block oder außerhalb davon befindet (aus Vereinfachungsgründen verwende ich als Wert des Schalters gleich den Namen der Datei, in welche im einen oder anderen Fall die Zeile geschrieben werden soll).
Sobald feststeht, welche Art von Zeile vorliegt (in "Process"-Block, Beginn "Process"-Block, Ende "Process"-Block oder "dazwischen"), kann die entsprechende Verarbeitung erfolgen - in meinem Ansatz wird auch nur bei "Process start" und "Process end" nur zwischen den Dateien "umgeschaltet" und ansonsten die Zeile in die passende Datei geschrieben:
@echo off & setlocal
set "Datei=c:\test\testdatei2.txt"
set "Von=Process start"
set "Bis=Process end"
set "AusP=c:\test\Ausgabe.txt"
set "AusZ=c:\test\Ausgabe2.txt"
del "%AusP%" 2>nul
del "%AusZ%" 2>nul
REM Zeilen vor erstem "Process start" gehören zum "Zwischen"-Block
set "Aus=%AusZ%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" & call :ProcessLine
goto :eof
:ProcessLine
if "%Aus%" neq "%AusP%" (
REM Nicht in einem "Process"-Block
echo "%Zeile%"|findstr /c:"%Von%">nul && (
REM "Process"-Block beginnt
set "Aus=%AusP%"
goto :eof
) || (
REM Zeile aus "Zwischen"-Block verarbeiten - hier nur Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo(!Zeile!
endlocal
)
) else (
REM In einem "Process"-Block
echo "%Zeile%"|findstr /c:"%Bis%">nul && (
REM "Process"-Block endet
set "Aus=%AusZ%"
goto :eof
) || (
REM Zeile des "Process"-Blocks verarbeiten - ebenfalls nur Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo(!Zeile!
endlocal
)
)
goto :eof
Grüße
bastla
Aloha dedalus2011,
darf ich dich ganz herzlich darum bitten, deine Beiträge insofern nachzubearbeiten, dass du die Codes in sinnvollen
## Tags setzt, das wäre zum Wohle aller Augen ... bastla mag zwar durchaus das Plaintext-Lesen sich angewöhnt haben aber deswegen muss man diese nicht ignorieren ...
Wenn du dich fragst, wo die Formatierungen herstammen, wirf doch mal einen Blick auf das rot aufleuchtende Wort red|Formatierungshilfe## beim Beitrag-Bearbeiten.
greetz André
darf ich dich ganz herzlich darum bitten, deine Beiträge insofern nachzubearbeiten, dass du die Codes in sinnvollen
## Tags setzt, das wäre zum Wohle aller Augen ... bastla mag zwar durchaus das Plaintext-Lesen sich angewöhnt haben aber deswegen muss man diese nicht ignorieren ...
Wenn du dich fragst, wo die Formatierungen herstammen, wirf doch mal einen Blick auf das rot aufleuchtende Wort red|Formatierungshilfe## beim Beitrag-Bearbeiten.
greetz André
Hallo dedalus2011!
Grüße
bastla
if-else-if Konstrukten funktionieren nicht
... möchte ich doch nicht ganz so stehen lassen:@echo off & setlocal
set "Datei=c:\test\testdatei2.txt"
set "Von=recipe start"
set "Bis=recipe end"
set "ISC=ISC"
set "CT=CT"
set "AusP_ISC=c:\test\Ausgabe_ISC.txt"
set "AusP_CT=c:\test\Ausgabe_CT.txt"
set "AusZ=c:\test\Ausgabe2.txt"
del "%AusP_ISC%" 2>nul
del "%AusP_CT%" 2>nul
del "%AusZ%" 2>nul
set "Aus=%AusZ%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" & call :ProcessLine
goto :eof
:ProcessLine
if "%Aus%"=="%AusZ%" (
REM Nicht in einem "recipe"-Block
echo "%Zeile%"|findstr /c:"%Von%">nul && (
REM "recipe"-Block beginnt - Ausgabedatei ermitteln und setzen, Zeile nicht ausgeben
echo "%Zeile%"|findstr /c:"%ISC%">nul && set "Aus=%AusP_ISC%"
echo "%Zeile%"|findstr /c:"%CT%">nul && set "Aus=%AusP_CT%"
goto :eof
)
REM Weiterhin zwischen "recipe"-Blöcken, daher Zeile ausgeben - erfolgt unten
) else (
REM In einem "recipe"-Block
echo "%Zeile%"|findstr /c:"%Bis%">nul && (
REM "recipe"-Block endet, daher Zeile nicht ausgeben
set "Aus=%AusZ%"
goto :eof
)
REM Weiterhin in einem "recipe"-Block, daher Zeile ausgeben - erfolgt unten
)
REM Ausgabe der aktuellen Zeile in die derzeit gewählte Ausgabedatei
setlocal enabledelayedexpansion
>>"%Aus%" echo(!Zeile!
endlocal
goto :eof
bastla