Wie kann ich mehrere aufeinanderfolgende Zeilen aus einer Textdatei auslesen?
Hallo erstmal zusammen,
nachdem ich mir in den letzten Tagen hier schon massig Anregungen und Informationen "zusammengeklaut" habe
bin ich momentan an einen Punkt gekommen wo ich mich dann doch anmelden durfte...
kommen wir zu meiner Frage...
Besteht irgendwie die Möglichkeit per findstr oder auch anders, eine Textdatei zu durchsuchen und sollte etwas in
bsp. Zeile 10 gefunden werden, die Zeilen 10-13 auszugeben oder in eine andere Datei zu schreiben.
Gleiches gilt natürlich dann auch für die Zeilen 25-28 oder 46-49 je nachdem wo ein Treffer liegt... X Folgezeilen mitzunehmen.
Mag sein dass es hier schonmal eine ähnlich Anfrage gab aber entweder war ich nach langem Suchen
zu doof es zu verstehen oder ich habs schlicht und einfach übersehen.
Ich habs dann auch mal anders versuch aber irgendwie fall ich auch da auf die Nase...
Hier lese ich halt nicht mehrere Folgezeilen aus sondern versuch es nur mit der dritten die mir zur Not reichen würde.
Das Problem ist, das die findstr %statusline% logischerweise nicht nur die Zeilennummern sondern den ganzen Text durchsucht
kann ich das irgendwie auf Token 1 begrenzen oder hab ich hier irgendwo nen Denkfehler.
Teile des Codeschnipsel s.u. hatte ich auch von hier.
@echo off
set quelle=c:\temp\quelle.txt
set ziel=C:\temp\ziel.txt
:dienstline
for /f "tokens=1,2 delims=:" %%i in ('findstr /i /n "text" %quelle%') do set /a statusline=%%i +3 & echo %%j >>%ziel% & call:statusline
goto end
:statusline
for /f "tokens=1,2 delims=:" %%k in ('findstr /i /n "%statusline%:" %quelle%') do echo %%l >>%ziel%
goto:eof
:end
Danke schonmal im Voraus
Knight
nachdem ich mir in den letzten Tagen hier schon massig Anregungen und Informationen "zusammengeklaut" habe
bin ich momentan an einen Punkt gekommen wo ich mich dann doch anmelden durfte...
kommen wir zu meiner Frage...
Besteht irgendwie die Möglichkeit per findstr oder auch anders, eine Textdatei zu durchsuchen und sollte etwas in
bsp. Zeile 10 gefunden werden, die Zeilen 10-13 auszugeben oder in eine andere Datei zu schreiben.
Gleiches gilt natürlich dann auch für die Zeilen 25-28 oder 46-49 je nachdem wo ein Treffer liegt... X Folgezeilen mitzunehmen.
Mag sein dass es hier schonmal eine ähnlich Anfrage gab aber entweder war ich nach langem Suchen
zu doof es zu verstehen oder ich habs schlicht und einfach übersehen.
Ich habs dann auch mal anders versuch aber irgendwie fall ich auch da auf die Nase...
Hier lese ich halt nicht mehrere Folgezeilen aus sondern versuch es nur mit der dritten die mir zur Not reichen würde.
Das Problem ist, das die findstr %statusline% logischerweise nicht nur die Zeilennummern sondern den ganzen Text durchsucht
kann ich das irgendwie auf Token 1 begrenzen oder hab ich hier irgendwo nen Denkfehler.
Teile des Codeschnipsel s.u. hatte ich auch von hier.
@echo off
set quelle=c:\temp\quelle.txt
set ziel=C:\temp\ziel.txt
:dienstline
for /f "tokens=1,2 delims=:" %%i in ('findstr /i /n "text" %quelle%') do set /a statusline=%%i +3 & echo %%j >>%ziel% & call:statusline
goto end
:statusline
for /f "tokens=1,2 delims=:" %%k in ('findstr /i /n "%statusline%:" %quelle%') do echo %%l >>%ziel%
goto:eof
:end
Danke schonmal im Voraus
Knight
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 158950
Url: https://administrator.de/contentid/158950
Ausgedruckt am: 01.11.2024 um 02:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo Knight-tr und willkommen im Forum!
Sollte sich in Batch (ich würde ja eher VBS dafür verwenden) etwa so machen lassen:
Grüße
bastla
Sollte sich in Batch (ich würde ja eher VBS dafür verwenden) etwa so machen lassen:
@echo off & setlocal
set quelle=c:\temp\quelle.txt
set ziel=C:\temp\ziel.txt
set "text=text"
set /a Folgezeilen=3"
del "%ziel%" 2>nul
for /f "delims=:" %%i in ('findstr /i /n /c:"%text%" "%quelle%"') do set /a AbZeile=%%i-1 & call :ProcessLines
goto :eof
:ProcessLines
set /a Zeilen=Folgezeilen
setlocal enabledelayedexpansion
for /f "delims=" %%k in ('more +%AbZeile% "%quelle%"') do (
if !Zeilen! geq 0 echo %%k
set /a Zeilen-=1
)>>%ziel%
endlocal
goto:eof
bastla
Hallo Knight-tr!
Ein weiteres Schleifchen um die Zeile 8 herumwickeln sollte kein Problem sein (und eine zusätzliche Datei ersparen) - unter der Annahme, dass in %text% "SERVICE_NAME:" stünde, ginge das (ungetestet) etwa so:
Bisher ist der Batch noch relativ übersichtlich, aber Du könntest trotzdem die Liste auch so vorgeben:
Zeilen 14 bis 16:
Ansonsten einfach die Hilfe (
sollte aber anstelle von "in" richtig "nach Zeile n" heißen).
Grüße
bastla
muss ich den Suchtext inkl. dem vorangestellten "SERVICE_NAME: " angeben.
Dafür wäre ja schon mal mit dem Schalter "/c:" vorgesorgt ...Ein weiteres Schleifchen um die Zeile 8 herumwickeln sollte kein Problem sein (und eine zusätzliche Datei ersparen) - unter der Annahme, dass in %text% "SERVICE_NAME:" stünde, ginge das (ungetestet) etwa so:
for %%a in ("Dienst1" "Dienst2" "Dienst3" "Dienst4" "usw") do for /f "delims=:" %%i in ('findstr /i /n /c:"%text% %%~a" "%quelle%"') do set /a AbZeile=%%i-1 & call :ProcessLines
set Dienste="Dienst1" "Dienst2" "Dienst3" "Dienst4" "usw"
...
for %%a in (%Dienste%) do for /f "delims=:" %%i in ('findstr /i /n /c:"%text% %%~a" "%quelle%"') do set /a AbZeile=%%i-1 & call :ProcessLines
- Zeilenweise Ausgabe (ohne Zerlegung in "tokens", daher "
delims=
") der Zeilen aus der Quelldatei ab der gefundenen Zeile (= Überspringen der vorhergehenden Zeilen, also Nummer der Fundzeile - 1, durch Verwendung der "+
"-Option von "more
" - kannst es aber auch mit "skip
" versuchen, allerdings mag das keinen Wert von 0, und dieser würde ja entstehen, wenn der Suchbegriff schon in der ersten Zeile gefunden würde); die Variable%AbZeile%
hieße allerdings besser (weil verständlicher)%NachZeile%
- Schreiben der aktuellen Zeile in die Zieldatei, wenn aufgrund des Zählers (Countdown vom Wert von
%Folgezeilen%
auf 0) überhaupt noch Zeilen zu schreiben sind; zum Auslesen des innerhalb der Schleife veränderten Zählerwertes wird "delayedExpansion" benötigt, daher nicht%Zeilen%
, sondern!Zeilen!
- Verringern des Zählers
Ansonsten einfach die Hilfe (
if /?
, more /?
, etc) lesen (aber nicht immer alles glauben - zB findest Du für more
: +n Beginnt mit der Anzeige der ersten Datei in Zeile n.
Grüße
bastla
Hallo Knight-tf!
Als Demo für den Unterschied:
In der Demo wird die Batchdatei selbst zeilenweise ausgelesen, wobei unter Verwendung von
Grüße
bastla
bist auf die Tatsache warum die "Zeilen" jetzt in "!" stehen aber damit werd ich leben müssen.
Um zur Abwechslung auch mal mich zu zitieren :zum Auslesen des innerhalb der Schleife veränderten Zählerwertes wird "delayedExpansion" benötigt, daher nicht %Zeilen%, sondern !Zeilen!
Ohne "delayedexpansion" wird zwar der Variableninhalt innerhalb der Schleife verändert, aber da die "Erweiterung" (= das "Auslesen" des Inhaltes) von (Nicht-Schleifen-)Variablen defaultmäßig nur am Anfang einer Zeile (und die gesamte Schleife wird nur als eine Zeile interpretiert) vorgenommen wird, muss der Interpreter dazu überredet werden, auch zwischendurch ("verzögert") die Auflösung vorzunehmen. Damit dies erfolgen kann ist zunächst das "enablen" der "verzögerten Aufllösung" erforderlich und dann auch die Kennzeichnung der Variablen, für welche diese Möglichkeit genutzt werden soll, per "!" anstelle von "%".Als Demo für den Unterschied:
@echo off & setlocal
set /a Zeilen=3
setlocal enabledelayedexpansion
for /f "delims=" %%k in (%0) do (
if !Zeilen! geq 0 echo Noch !Zeilen! Zeilen #mit delayedexpansion#: %%k
if %Zeilen% geq 0 echo Noch %Zeilen% Zeilen #ohne delayedexpansion#: %%k
set /a Zeilen-=1
)
echo\
echo Endwert
echo !Zeilen!
echo %Zeilen%
endlocal
!Zeilen!
die Ausgabe auf die ersten 4 Zeilen beschränkt wird.Grüße
bastla
Hallo.
Sorry, daß ich diesen alten Thread nochmal hervorhole,
das Script ist echt super und ist genau daß, was ich brauche.
Aber ich habe noch folgendes Problem :
in meiner zu durchsuchenden Textdatei sind viele Wörter von Sonderzeichen umgeben wie z.B. "!" und werden
dann bei der Ausgabe nicht mit übertragen.
Meine Frage nun, wie kann ich diese Sonderzeichen maskieren, bzw. an welcher Stelle muss ich die
Maskierung einfügen, damit auch die Wörter mit den Sonderzeichen ausgegeben werden ?
Viele Grüße,
Anna.
Sorry, daß ich diesen alten Thread nochmal hervorhole,
das Script ist echt super und ist genau daß, was ich brauche.
Aber ich habe noch folgendes Problem :
in meiner zu durchsuchenden Textdatei sind viele Wörter von Sonderzeichen umgeben wie z.B. "!" und werden
dann bei der Ausgabe nicht mit übertragen.
Meine Frage nun, wie kann ich diese Sonderzeichen maskieren, bzw. an welcher Stelle muss ich die
Maskierung einfügen, damit auch die Wörter mit den Sonderzeichen ausgegeben werden ?
Viele Grüße,
Anna.
Hallo Anna79 und ein verspätetes Willkommen im Forum!
Versuch es mit folgendem Unterprogramm:
Dadurch, dass die jeweilige Ausgabe bereits vor dem Aktivieren der "
Grüße
bastla
Versuch es mit folgendem Unterprogramm:
:ProcessLines
set /a Zeilen=Folgezeilen
for /f "delims=" %%k in ('more +%AbZeile% "%quelle%"') do (
set "Ausgabe=%%k"
setlocal enabledelayedexpansion
if !Zeilen! geq 0 echo !Ausgabe!
endlocal
set /a Zeilen-=1
)>>%ziel%
goto:eof
delayedExpansion
" erzeugt wird, sollten auch die "!" (und dazwischen befindliche Textteile) erhalten bleiben.Grüße
bastla
Hallo Bastla.
Ooh daran lag es, ok, darauf wäre ich auf jeden Fall nie gekommen.
Aber es funktioniert wunderbar, vielen Dank !!!
Ein tolles Forum, echt.
Konnte schon bestimmt 1000 Fragen mithilfe der Suchfunktion beantworten.
Du und Biber, Ihr singt bestimmt immer "I got 99 Problems....but a Batch ain't one" (Jay-Z) ;)
Viele Grüße,
Anna.
Ooh daran lag es, ok, darauf wäre ich auf jeden Fall nie gekommen.
Aber es funktioniert wunderbar, vielen Dank !!!
Ein tolles Forum, echt.
Konnte schon bestimmt 1000 Fragen mithilfe der Suchfunktion beantworten.
Du und Biber, Ihr singt bestimmt immer "I got 99 Problems....but a Batch ain't one" (Jay-Z) ;)
Viele Grüße,
Anna.