Top-Themen

Aktuelle Themen (A bis Z)

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, 2589 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 ..
Ähnliche Inhalte
Batch & Shell
Bestimmten Bereich einer Textdatei ausgeben mittels Batch
gelöst Frage von Django.DuranoBatch & Shell10 Kommentare

Hallo, gibt es eine Möglichkeit eine Textdatei mittels Batch zu durchsuchen und einen bestimmten Teil davon dann aber nur ...

Batch & Shell
Bestimmte Zeile einer Textdatei mit Batch auslesen
gelöst Frage von PinkFLuffyUnicornBatch & Shell2 Kommentare

Hi, ich habe ein kleines Batch Script, welches mir den Status der Firewall ausgeben soll(ob an oder aus) der ...

Batch & Shell
VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen)
gelöst Frage von Luuke257Batch & Shell5 Kommentare

Hallo zusammen! Vorweg, ich bin absoluter neuling im Scripten, ich habe mir das alles nur so zusammengebastelt und versuche ...

Batch & Shell
Batch: Vorkommen eines strings in mehreren Dateien zählen und pro Datei ausgeben
gelöst Frage von ole-objektBatch & Shell3 Kommentare

Hallo, ich muss später über 180 Dateien (mehr als 3 GB) auf das Auftreten bestimmter Strings durchsuchen um zu ...

Neue Wissensbeiträge
Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 6 StundenInternet2 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 10 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Windows 10

Microsoft bestätigt DMA-Policy-Problem in Win10 v1709

Information von DerWoWusste vor 10 StundenWindows 10

Wer sein Gerät mit der DMA-Policy absichert, bekommt evtl. Hardwareprobleme in v1709 von Win10. Warum? Weil v1709 endlich "richtig" ...

Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 13 StundenVerschlüsselung & Zertifikate

Interessant Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows SSH-Kommando in CMD.exe und PowerShell

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server19 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server15 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...