Text-Begriff-Nummer in Datei suchen und bestimmte Zeile auslesen
Hallo,
ich suche eine Möglichkeit, eine Datei nach einem Text/Begriff/Nummer zu durchsuchen, um mir dann eine bestimme Zeile auslesen zu lassen.
Dateitypen sind unterschiedlich, können LOG, TXT, CACHE, ... sein, der Inhalt allerdings ist normaler Text.
Ich möchte dann nach Text "ABCDE" suchen, sofern vorhanden soll mir das Batch 17 Zeilen weiter oben diese Zeile auslesen.
Bislang habe ich folgendes realisiert, die Suche klappt und die gefundene Zeile wird ausgegeben:
Es ist vorab eine Teil-Lösung, anhand vom Suchergebnis, müsste ich in einer anderen Datei ebenfalls so weitersuchen und eine Zeile X auslesen.
Danke vorab.
ich suche eine Möglichkeit, eine Datei nach einem Text/Begriff/Nummer zu durchsuchen, um mir dann eine bestimme Zeile auslesen zu lassen.
Dateitypen sind unterschiedlich, können LOG, TXT, CACHE, ... sein, der Inhalt allerdings ist normaler Text.
Ich möchte dann nach Text "ABCDE" suchen, sofern vorhanden soll mir das Batch 17 Zeilen weiter oben diese Zeile auslesen.
Bislang habe ich folgendes realisiert, die Suche klappt und die gefundene Zeile wird ausgegeben:
@echo off
:START
echo.
echo. ######################################
echo. # #
echo. # Suche nach Text #
echo. # #
echo. ######################################
echo.
echo Suche nach Text:
set /p wort=
echo.
find /i "%wort%" testfile.txt
echo.
echo.
GOTO START
Es ist vorab eine Teil-Lösung, anhand vom Suchergebnis, müsste ich in einer anderen Datei ebenfalls so weitersuchen und eine Zeile X auslesen.
Danke vorab.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 254874
Url: https://administrator.de/contentid/254874
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo chgs2011.
Grüße
rubberman
Ich möchte dann nach Text "ABCDE" suchen, sofern vorhanden soll mir das Batch 17 Zeilen weiter oben diese Zeile auslesen.
@echo off &setlocal
set "search=ABCDE"
set "file=testfile.txt"
set "num=0"
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do set "num=%%i"
if %num% equ 0 (
echo Suchzeichenfolge nicht gefunden.
pause
exit /b
)
set /a "num -= 17"
if %num% lss 1 (
echo Datei ist zu kurz.
pause
exit /b
)
set "line="
<"%file%" (
for /l %%i in (2 1 %num%) do set /p "="
set /p "line="
)
setlocal EnableDelayedExpansion
echo(!line!
endlocal
pause
Es ist vorab eine Teil-Lösung, anhand vom Suchergebnis, müsste ich in einer anderen Datei ebenfalls so weitersuchen und eine Zeile X auslesen.
Ich verstehe kein Wort.Grüße
rubberman
Hallo chgs2011.
Klar geht das (FOR /R, FOR /F mit DIR /S oder FINDSTR /S). Du musst nur ein paar Infos rausrücken.
Niemand kennt das endgültige Ziel der Aktion, außer du selbst ...
Grüße
rubberman
Klar geht das (FOR /R, FOR /F mit DIR /S oder FINDSTR /S). Du musst nur ein paar Infos rausrücken.
- Bleibt die Suchzeichenfolge für alle Dateien gleich?
- Was soll mit den gefundenen Werten passieren? (Bildschirmausgabe, in eine andere Datei schreiben, irgendwo weiterverarbeiten ...)
- Musst du irgend eine Verbindung zu der Datei haben, in der die Suchzeichenfolge gefunden wurde?
Niemand kennt das endgültige Ziel der Aktion, außer du selbst ...
Grüße
rubberman
Hallo chgs2011.
Du hast zwar meine Fragen nicht beantwortet und was nun
Grüße
rubberman
Du hast zwar meine Fragen nicht beantwortet und was nun
in einer Datei Zeile 10+17 davor ausgeben
bedeuten soll ist mir schon wieder gänzlich unklar, aber naja ... dann musst du halt mit dem Vorlieb nehmen, was ich verstanden habe.@echo off &setlocal DisableDelayedExpansion
set "base=C:\Pfad zu\deinen Dateien"
set "ext=*.txt *.log *.cache"
set "search=ABCDE"
pushd "%base%"
for /f "delims=" %%f in ('dir /a-d /b %ext%') do (
set "file=%%f"
call :proc
)
popd
pause
exit /b
:proc
set "num=0"
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do set "num=%%i"
if %num% equ 0 exit /b
set /a "num -= 17"
if %num% lss 1 exit /b
set "line="
<"%file%" (
for /l %%i in (2 1 %num%) do set /p "="
set /p "line="
)
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Datei: "%file%"
setlocal EnableDelayedExpansion
echo(!line!
endlocal
exit /b
rubberman
Wenn es sich um XML handeln sollte, ist Batch der falsche Ansatz! Hier hangelt man sich durch das DOM und arbeitet mit Node-Objekten. Somit gibt es auch keine Probleme damit in welcher Zeile nun was zu finden ist, da es für XML sowieso egal ist ob der gesamte Inhalt in einer Zeile oder in 1000 steht. Das nächste Problem ist dass XML wahrscheinlich UTF-8 codiert vorliegt, Batch arbeitet mit ASCII. Etc.
Ich habe langsam keine Ahnung mehr, wie man dir helfen könnte, denn deine Aussage "der Inhalt allerdings ist normaler Text" ist schlicht falsch und Informationen fließen häppchenweise auf Anfrage (wenn überhaupt). Entweder du postest einen kompletten Beispielinhalt deiner Dateien mit Erklärung was genau du darin benötigst, oder ich klinke mich an dieser Stelle aus.
Grüße
rubberman
Ich habe langsam keine Ahnung mehr, wie man dir helfen könnte, denn deine Aussage "der Inhalt allerdings ist normaler Text" ist schlicht falsch und Informationen fließen häppchenweise auf Anfrage (wenn überhaupt). Entweder du postest einen kompletten Beispielinhalt deiner Dateien mit Erklärung was genau du darin benötigst, oder ich klinke mich an dieser Stelle aus.
Grüße
rubberman
In dem Fall habe ich keine Ahnung warum es nicht funktionieren soll. Mit deinen Beispielstrings habe ich bei meinem oben geposteten Code nicht die geringsten Probleme. Aber auch wie die Umsetzung in deinem eigenen Code aussieht, ist ohne Glaskugel nicht zu erahnen.
Grüße
rubberman
es sind aber leider keine XML-Files
Woran machst du das fest? Dass sie eine andere Dateiendung als *.xml haben?Den Inhalt kann ich aus verschiedenen Gründen nicht ohne weiteres zur Verfügung stellen, sonst hätte ich dies schon getan.
Nonsens. Sensible Daten lassen sich mit jedem x-beliebigen Texteditor entsprechend verfälschen, bevor man den Inhalt postet.Grüße
rubberman
Liegt an der Schleife in Zeile 20. Die Variable num wird so oft überschrieben, wie die Suchzeichenfolge gefunden wird. Mit dem letzten Wert wird weiter gearbeitet.
Wenn du mehrere Suchergebnisse hast, ist die ganze Sache nicht eindeutig und du hast sowieso ein grundsätzliches Problem. Du musst also schon dafür sorgen, dass deine Suchzeichenfolge auch eindeutig ist.
Grüße
rubberman
Wenn du mehrere Suchergebnisse hast, ist die ganze Sache nicht eindeutig und du hast sowieso ein grundsätzliches Problem. Du musst also schon dafür sorgen, dass deine Suchzeichenfolge auch eindeutig ist.
Grüße
rubberman
den ich versuche umzusetzen.
Öhm, dann würde ich das nächste mal gerne deinen noch nicht funktionierenden Versuch sehen.An sich sollte das relativ simpel sein, oder?
Dann verstehe ich nicht warum du ... ach egal ungetestet:
@echo off &setlocal DisableDelayedExpansion
set "base=C:\Pfad zu\deinen Dateien"
set "ext=*.lid"
set "search=ABCDE"
pushd "%base%"
2>nul md "backup"
for /f "delims=" %%f in ('dir /a-d /b %ext%') do (
set "file=%%f"
call :proc
)
popd
pause
exit /b
:proc
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do if %%i equ 10 (
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Datei: "%file%"
copy "%file%" "backup\"
)
exit /b
rubberman