Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Bestimmte Textbereiche die mehrmals in einer Textdatei vorkommen per Batch in einer Textdatei ausgeben

Frage Entwicklung Batch & Shell

Mitglied: dedalus2011

dedalus2011 (Level 1) - Jetzt verbinden

31.03.2012, aktualisiert 01.04.2012, 2532 Aufrufe, 5 Kommentare

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

01.
 
02.
setlocal EnableDelayedExpansion  
03.
 
04.
set strArrayNumber=0 
05.
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt') ^ 
06.
do (set strArrayValue=%%j && call:functionArray) 
07.
 
08.
goto :end 
09.
                    
10.
         
11.
:functionArray 
12.
 
13.
set /a strArrayNumber=%strArrayNumber% + 1 
14.
set strArrayName.%strArrayNumber%=%strArrayValue% 
15.
 
16.
goto :eof 
17.
 
18.
:end 
19.
 
20.
 
21.
echo FIRST %strArrayName.1% 
22.
set array1=%strArrayName.1% 
23.
 
24.
 
25.
:main 
26.
 
27.
for /f "delims=:" %%i in ('findstr /n /c:"process start" C:\test\testdatei2.txt') ^ 
28.
do @Set ZeileAb=%%i && call:subroutine1 
29.
 
30.
 
31.
goto :end 
32.
 
33.
 
34.
:subroutine1 
35.
 
36.
 
37.
 
38.
for /f "delims=:" %%j in ('findstr /n /c:"process end" C:\test\testdatei2.txt') ^ 
39.
do @Set ZeileBis=%%j && call:subroutine2  
40.
 
41.
 
42.
 
43.
goto :eof 
44.
 
45.
 
46.
:subroutine2 
47.
 
48.
 
49.
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt')  ^ 
50.
do @if %ZeileBis% gtr %ZeileAb% @if %%i gtr %ZeileAb% @if %%i Lss %ZeileBis% ^ 
51.
echo. %%~j >>C:\ausgabe.txt 
52.
 
53.
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ C:\test\testdatei2.txt')  ^ 
54.
do @if %ZeileBis% lss %ZeileAb% @if %%i lss %ZeileAb% @if %%i gtr %ZeileBis% ^ 
55.
echo. %%~j >>C:\ausgabe2.txt 
56.
 
57.
 
58.
goto :eof 
59.
 
60.
:end 
61.
 
62.
pause 
63.
 
Mitglied: bastla
31.03.2012 um 17:39 Uhr
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:
01.
@echo off & setlocal 
02.
set "Datei=c:\test\testdatei2.txt" 
03.
 
04.
set "Von=Process start" 
05.
set "Bis=Process end" 
06.
 
07.
set "AusP=c:\test\Ausgabe.txt" 
08.
set "AusZ=c:\test\Ausgabe2.txt" 
09.
 
10.
del "%AusP%" 2>nul 
11.
del "%AusZ%" 2>nul 
12.
REM Zeilen vor erstem "Process start" gehören zum "Zwischen"-Block 
13.
set "Aus=%AusZ%" 
14.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" & call :ProcessLine 
15.
goto :eof 
16.
 
17.
:ProcessLine 
18.
if "%Aus%" neq "%AusP%" ( 
19.
    REM Nicht in einem "Process"-Block 
20.
    echo "%Zeile%"|findstr /c:"%Von%">nul && ( 
21.
        REM "Process"-Block beginnt 
22.
        set "Aus=%AusP%" 
23.
        goto :eof 
24.
    ) || ( 
25.
        REM Zeile aus "Zwischen"-Block verarbeiten - hier nur Ausgabe 
26.
        setlocal enabledelayedexpansion 
27.
        >>"%Aus%" echo(!Zeile! 
28.
        endlocal 
29.
30.
) else ( 
31.
    REM In einem "Process"-Block 
32.
    echo "%Zeile%"|findstr /c:"%Bis%">nul && ( 
33.
        REM "Process"-Block endet 
34.
        set "Aus=%AusZ%" 
35.
        goto :eof 
36.
    ) || ( 
37.
        REM Zeile des "Process"-Blocks verarbeiten - ebenfalls nur Ausgabe 
38.
        setlocal enabledelayedexpansion 
39.
        >>"%Aus%" echo(!Zeile! 
40.
        endlocal 
41.
42.
43.
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
Bitte warten ..
Mitglied: dedalus2011
01.04.2012 um 02:54 Uhr
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


01.
 setlocal enabledelayedexpansion  
02.
 
03.
 
04.
set "Datei=c:\test\testdatei2.txt"  
05.
 
06.
  
07.
set "Start=process start"  
08.
set "End=process end"  
09.
  
10.
 
11.
set "AusP_ISC=c:\test\Ausgabe_ISC.txt" 
12.
set "AusP_CT=c:\test\Ausgabe_CT.txt" 
13.
  
14.
set "AusZ=c:\test\Ausgabe2.txt"  
15.
 
16.
del "%AusP_ISC%" 2>nul  
17.
del "%AusP_CT%" 2>nul  
18.
del "%AusZ%" 2>nul  
19.
 
20.
 
21.
set "Aus=%AusZ%"  
22.
pause 
23.
 
24.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" && call :ProcessLine  
25.
 
26.
goto :end 
27.
 
28.
  
29.
 
30.
:ProcessLine  
31.
 
32.
@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusP_CT%" (  
33.
 
34.
(echo "%Zeile%"|findstr /c:"%Start%">nul) && (echo "%Zeile%"|findstr /c:"%ISC%">nul) && (set "Aus=%AusP_ISC%" goto :eof) || 
35.
 
36.
 (echo "%Zeile%"|findstr /c:"%Start%">nul) && (echo "%Zeile%"|findstr /c:"%CT%">nul) && (set "Aus=%AusP_CT%" goto :eof) ||  
37.
 
38.
(>>"%Aus%" echo. !Zeile!) )  
39.
 
40.
 
41.
else @if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusZ%" ( 
42.
 
43.
(echo "%Zeile%"|findstr /c:"%End%">nul) && (echo "%Zeile%"|findstr /c:"%CT%">nul) && (set "Aus=%AusZ%" goto :eof) ||  
44.
 
45.
(>>"%Aus%" echo. !Zeile!) )  
46.
 
47.
 
48.
else @if "%Aus%" neq "%AusP_CT%" @if "%Aus%" neq "%AusZ%" ( 
49.
 
50.
(echo "%Zeile%"|findstr /c:"%End%">nul) && (echo "%Zeile%"|findstr /c:"%ISC%">nul) && (set "Aus=%AusZ%" goto :eof) ||  
51.
 
52.
(>>"%Aus%" echo. !Zeile!)) 
53.
 
54.
 
55.
goto :eof 
56.
 
57.
 
58.
:end 
59.
 
60.
pause 
61.
 
Bitte warten ..
Mitglied: Skyemugen
01.04.2012 um 08:08 Uhr
Aloha dedalus2011,

darf ich dich ganz herzlich darum bitten, deine Beiträge insofern nachzubearbeiten, dass du die Codes in sinnvollen
<code></code> 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 Formatierungshilfe beim Beitrag-Bearbeiten.

greetz André
Bitte warten ..
Mitglied: dedalus2011
01.04.2012 um 17:46 Uhr
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



01.
 
02.
setlocal enabledelayedexpansion  
03.
 
04.
 
05.
set "Datei=c:\test\testdatei2.txt"  
06.
 
07.
  
08.
set "Start=recipe start"  
09.
set "End=recipe end"  
10.
 
11.
set "ISC=ISC" 
12.
set "CT=CT"  
13.
 
14.
set "AusP_ISC=c:\test\Ausgabe_ISC.txt" 
15.
set "AusP_CT=c:\test\Ausgabe_CT.txt" 
16.
  
17.
set "AusZ=c:\test\Ausgabe2.txt"  
18.
 
19.
del "%AusP_ISC%" 2>nul  
20.
del "%AusP_CT%" 2>nul  
21.
del "%AusZ%" 2>nul  
22.
 
23.
 
24.
set "Aus=%AusZ%"  
25.
pause 
26.
 
27.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" && call :ProcessLine  
28.
 
29.
goto :end 
30.
 
31.
  
32.
 
33.
:ProcessLine  
34.
 
35.
@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusP_CT%" goto a 
36.
@if "%Aus%" neq "%AusP_ISC%" @if "%Aus%" neq "%AusZ%" goto b 
37.
@if "%Aus%" neq "%AusP_CT%" @if "%Aus%" neq "%AusZ%" goto c 
38.
 
39.
goto :eof 
40.
 
41.
 
42.
 
43.
:a  
44.
 
45.
 
46.
echo "%Zeile%"|findstr /c:"%Start%">nul && echo "%Zeile%"|findstr /c:"%ISC%">nul && set "Aus=%AusP_ISC%" goto :eof ||  
47.
48.
echo "%Zeile%"|findstr /c:"%Start%">nul && echo "%Zeile%"|findstr /c:"%CT%">nul && set "Aus=%AusP_CT%" goto :eof) ||  
49.
50.
>>"%Aus%" echo. !Zeile!)  
51.
 
52.
goto :eof 
53.
 
54.
 
55.
:b  
56.
 
57.
 
58.
echo "%Zeile%"|findstr /c:"%End%">nul && set "Aus=%AusZ%" goto :eof ||  
59.
60.
>>"%Aus%" echo. !Zeile!) 
61.
 
62.
goto :eof 
63.
 
64.
 
65.
:c 
66.
 
67.
 
68.
 
69.
echo "%Zeile%"|findstr /c:"%End%">nul && set "Aus=%AusZ%" goto :eof ||  
70.
71.
>>"%Aus%" echo. !Zeile!) 
72.
 
73.
goto :eof 
74.
 
75.
 
76.
 
77.
:end 
78.
 
79.
pause 
80.
 
Bitte warten ..
Mitglied: bastla
01.04.2012 um 20:28 Uhr
Hallo dedalus2011!
if-else-if Konstrukten funktionieren nicht
... möchte ich doch nicht ganz so stehen lassen:
01.
@echo off & setlocal 
02.
set "Datei=c:\test\testdatei2.txt" 
03.
 
04.
set "Von=recipe start" 
05.
set "Bis=recipe end" 
06.
 
07.
set "ISC=ISC" 
08.
set "CT=CT" 
09.
 
10.
set "AusP_ISC=c:\test\Ausgabe_ISC.txt"  
11.
set "AusP_CT=c:\test\Ausgabe_CT.txt"  
12.
set "AusZ=c:\test\Ausgabe2.txt" 
13.
 
14.
del "%AusP_ISC%" 2>nul 
15.
del "%AusP_CT%" 2>nul 
16.
del "%AusZ%" 2>nul 
17.
 
18.
set "Aus=%AusZ%" 
19.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" & call :ProcessLine 
20.
goto :eof 
21.
 
22.
:ProcessLine 
23.
if "%Aus%"=="%AusZ%" ( 
24.
    REM Nicht in einem "recipe"-Block 
25.
    echo "%Zeile%"|findstr /c:"%Von%">nul && ( 
26.
        REM "recipe"-Block beginnt - Ausgabedatei ermitteln und setzen, Zeile nicht ausgeben 
27.
        echo "%Zeile%"|findstr /c:"%ISC%">nul && set "Aus=%AusP_ISC%" 
28.
        echo "%Zeile%"|findstr /c:"%CT%">nul && set "Aus=%AusP_CT%" 
29.
        goto :eof 
30.
31.
    REM Weiterhin zwischen "recipe"-Blöcken, daher Zeile ausgeben - erfolgt unten 
32.
) else ( 
33.
    REM In einem "recipe"-Block 
34.
    echo "%Zeile%"|findstr /c:"%Bis%">nul && ( 
35.
        REM "recipe"-Block endet, daher Zeile nicht ausgeben 
36.
        set "Aus=%AusZ%" 
37.
        goto :eof 
38.
39.
    REM Weiterhin in einem "recipe"-Block, daher Zeile ausgeben - erfolgt unten 
40.
41.
 
42.
REM Ausgabe der aktuellen Zeile in die derzeit gewählte Ausgabedatei 
43.
setlocal enabledelayedexpansion 
44.
>>"%Aus%" echo(!Zeile! 
45.
endlocal 
46.
goto :eof
Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...