chgs2011
Goto Top

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:

@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.

Content-ID: 254874

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

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

rubberman
rubberman 14.11.2014 um 16:17:28 Uhr
Goto Top
Hallo chgs2011.

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
chgs2011
chgs2011 17.11.2014 um 07:57:22 Uhr
Goto Top
Danke rubberman, der Ansatz sieht super aus und klappt für einzelne Files!

Ich würde das gerne aber auf mehrere Dateien zeitgleich nutzen, am liebstens würde ich alle Dateien in einem Order Y mit X Unterordner durchsuchen.

Ginge das generell?
rubberman
rubberman 17.11.2014 um 12:07:50 Uhr
Goto Top
Hallo chgs2011.

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 ... face-wink

Grüße
rubberman
chgs2011
chgs2011 17.11.2014 um 12:53:27 Uhr
Goto Top
Ich muss in X Verzeichnissen verschiedene Dateitypen durchsuchen.

Die Struktur ist bislang gleich, habe diese verglichen.

Ich muss lediglich in einer Datei Zeile 10+17 davor ausgeben, das reicht mir vollkommen aus.
rubberman
rubberman 17.11.2014 aktualisiert um 16:34:53 Uhr
Goto Top
Hallo chgs2011.

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
Grüße
rubberman
chgs2011
chgs2011 20.11.2014 um 10:55:28 Uhr
Goto Top
Danke für die Ausarbeitung, klappt soweit schon sehr gut face-smile

Nochmal zum Verständnis, ich möchte einen Textbaustein suchen, den ersten den er findet soll als Bezug dienen.
Von diesem Bezug aus (Zeile 37) soll er dann die Zeile 27 und 20 ausgeben.

Ich habe nun eben festgestellt, dass ich auch Sonderzeichen habe, meine Suche dadurch natürlich nicht klappt.

Suchtext z.B.: <key>order:</key>

Habe es so versucht: ^<key^>order:^</key^>

Aber das will nicht so recht.

Vielen Dank bis dahin!
rubberman
rubberman 20.11.2014 aktualisiert um 16:26:14 Uhr
Goto Top
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
chgs2011
chgs2011 20.11.2014 um 17:02:47 Uhr
Goto Top
Danke rubberman, es sind aber leider keine XML-Files, es sind diverse Datenbank-Files eines PDM-Systems.

Diese Dateiendungen werden zudem indexiert und können heißen:
xxxxx.log.1
xxxxx.log.2
xxxxx.log.3
xxxxx.cache.1
xxxxx.cache.2
xxxxx.cache.3


Den Inhalt kann ich aus verschiedenen Gründen nicht ohne weiteres zur Verfügung stellen, sonst hätte ich dies schon getan.

Wie bereits erwähnt klappt soweit die Suche, wenn ich starr nach den Werten suche.
Ich wollte die Suche aber genauer Eingrenzen, eben mit derartigen "Tags" in der Datei, da die gesuchen Werte mehrmals vorkommen.


Beispiel:

Suchbegriff XXX
<id>order: XXX</id>
<key>order: XXX</key>


Wenn ich dann Zeile 10 und 17 davor auslesen muss, ist es wichtig den richtigen Zeilen-Startpunkt zu finden,
daher wollte ich nun den ganzen String suchen:

<key>order: XXX</key>


Mir würde auch ein Platzhalter ausreichen wie:

*key*order*XXX*key*


Sorry für die Umstände, bin leider auch etwas gefesselt.
Bislang bekomme ich halt mit dem Script zuviele Zeilen ausgegeben, die man aber auch manuell von Hand filtern kann.
rubberman
rubberman 20.11.2014 um 18:19:06 Uhr
Goto Top
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.

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
chgs2011
chgs2011 21.11.2014 um 10:55:42 Uhr
Goto Top
Ich versuche es zunächst mal so.

Nur eine letzte Frage, der Suchbegriff wird gesucht, er sucht in der Datei aber immer nur die letzte und gibt diese aus.

Was ist mit den Suchergebnissen, die zuvor mehrmals gefunden wurden? Woran liegt das?
rubberman
rubberman 21.11.2014 um 12:27:42 Uhr
Goto Top
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
chgs2011
chgs2011 27.11.2014 um 16:34:38 Uhr
Goto Top
So, habe nun paar Tage bissel versucht und analysiert, leider komme ich nicht 100% auf brauchbare Ausgaben.

Ich musste leider feststellen, dass die Datenbank so komplexe Cache-Files erzeugt, dass nicht einmal die Struktur einheitlich ist.

Allerdings habe ich einen anderen Lösungsansatz gefunden, den ich versuche umzusetzen.

Ich danke dir vielmals für die Beispiele, sind bei mir im Archiv, da ich das auf jeden Fall wieder mal brauchen werde!!!


Ich hoffe ich kann auf deine Unterstützung zählen, beim neuen Lösungsansatz? face-smile


Lösungsansatz:
Ich möchte nun alle Dateien mit Endung ".lid" in einem Ordner auf Inhalt durchsuchen.
Hierzu möchte ich einen Suchbegriff in Zeile 10 abfragen.
Sollte der Suchbegriff in Zeile 10 vorhanden sein, soll diese Datei kopiert und in einen Unterordner "backup" gelegt werden.

An sich sollte das relativ simpel sein, oder?

Vielen Dank vorab.
rubberman
rubberman 29.11.2014 um 14:31:43 Uhr
Goto Top
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 face-sad

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
Grüße
rubberman