dedalus2011
Goto Top

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

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

Content-Key: 182899

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: bastla
bastla Mar 31, 2012 at 15:39:53 (UTC)
Goto Top
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:
@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 
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
Member: dedalus2011
dedalus2011 Apr 01, 2012 at 00:54:49 (UTC)
Goto Top
Hallo bastla und besten Dank für deine Hilfe!

die Textbereiche zwischen "start" und "end" für alle im Text vorkommende Zeichenketten vom Typ "start" und "end" sollen je nach Besitzertyp in drei unterschiedlichen Textdateien ausgegeben werden. (Der Zwischen-Block wird in der Ausgabe2.txt Datei, die Process-Blöcken je nach Besitzertyp jeweils in den AusP_ISC.txt und AusP_CT.txt Dateien ausgegeben. Wie würden jetzt die "Schalter"-Variablen für drei Textdateien funktionieren? Habe mir folgendes überlegt, weiss allerdings nicht ob es so wirklich funktioniert.

Wäre für jegliche Tipps dankbar

dedalus2011


 setlocal enabledelayedexpansion 


set "Datei=c:\test\testdatei2.txt"   

 
set "Start=process start"   
set "End=process end"   
 

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%"   
pause

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" && call :ProcessLine   

goto :end

 

:ProcessLine 

@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusP_CT%" (   

(echo "%Zeile%"|findstr /c:"%Start%">nul) && (echo "%Zeile%"|findstr /c:"%ISC%">nul) && (set "Aus=%AusP_ISC%" goto :eof) ||  

 (echo "%Zeile%"|findstr /c:"%Start%">nul) && (echo "%Zeile%"|findstr /c:"%CT%">nul) && (set "Aus=%AusP_CT%" goto :eof) ||   

(>>"%Aus%" echo. !Zeile!) )   


else @if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusZ%" (  

(echo "%Zeile%"|findstr /c:"%End%">nul) && (echo "%Zeile%"|findstr /c:"%CT%">nul) && (set "Aus=%AusZ%" goto :eof) ||   

(>>"%Aus%" echo. !Zeile!) )   


else @if "%Aus%" neq "%AusP_CT%" @if "%Aus%" neq "%AusZ%" (  

(echo "%Zeile%"|findstr /c:"%End%">nul) && (echo "%Zeile%"|findstr /c:"%ISC%">nul) && (set "Aus=%AusZ%" goto :eof) ||   

(>>"%Aus%" echo. !Zeile!))  


goto :eof


:end

pause
Member: Skyemugen
Skyemugen Apr 01, 2012 at 06:08:30 (UTC)
Goto Top
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é
Member: dedalus2011
dedalus2011 Apr 01, 2012 at 15:46:20 (UTC)
Goto Top
Hallo,

if-else-if Konstrukten funktionieren nicht. Deshalb habe ich alternativ meine Idee mit Hilfe von goto Konstrukten umgesetzt. Der Zwischen-Block wird in der Ausgabe2.txt Datei, die Process-Blöcken je nach Besitzertyp jeweils in den AusP_ISC.txt und AusP_CT.txt Dateien ausgegeben. Die "Schalter"-Variablen für drei Textdateien funktionieren nur in Verbindung mit goto Konstrukten.

Anbei der Code. Danke an Euch allen für Eure Hilfe.

Grüße

dedalus2011


setlocal enabledelayedexpansion 


set "Datei=c:\test\testdatei2.txt"   

 
set "Start=recipe start"   
set "End=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%"   
pause

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" && call :ProcessLine   

goto :end

 

:ProcessLine 

@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusP_CT%" goto a  
@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusZ%" goto b  
@if "%Aus%" neq "%AusP_CT%" @if "%Aus%" neq "%AusZ%" goto c  

goto :eof



:a 


echo "%Zeile%"|findstr /c:"%Start%">nul && echo "%Zeile%"|findstr /c:"%ISC%">nul && set "Aus=%AusP_ISC%" goto :eof ||   
(
echo "%Zeile%"|findstr /c:"%Start%">nul && echo "%Zeile%"|findstr /c:"%CT%">nul && set "Aus=%AusP_CT%" goto :eof) ||   
(
>>"%Aus%" echo. !Zeile!)   

goto :eof


:b 


echo "%Zeile%"|findstr /c:"%End%">nul && set "Aus=%AusZ%" goto :eof ||   
(
>>"%Aus%" echo. !Zeile!)  

goto :eof


:c



echo "%Zeile%"|findstr /c:"%End%">nul && set "Aus=%AusZ%" goto :eof ||   
(
>>"%Aus%" echo. !Zeile!)  

goto :eof



:end

pause
Member: bastla
bastla Apr 01, 2012 at 18:28:32 (UTC)
Goto Top
Hallo dedalus2011!
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
Grüße
bastla