m0nstar
Goto Top

TXT von unten nach oben durchsuchen mit vbscript

Ich würde gerne eine TXT von unten durchsuchen

Hallo,

ich würde gerne eine TXT von unten durchsuchen und auch nur das letzte Ergebnis anzeigen wollen.

Wie man eine TXT durchsuchen kann weiß ich, aber wie geht das von unten nach oben? Hat da jemand eine Idee?

Beispiel:
hallo
hallo2
hallo3
hallo2
hallo
hallo4
search string= hallo (dann soll er mir nicht das erste hallo ausgeben sondern das letzte.

Gruß,
m0nstar

Content-Key: 146229

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

Printed on: April 24, 2024 at 02:04 o'clock

Mitglied: 77559
77559 Jul 05, 2010 at 10:26:10 (UTC)
Goto Top
Hallo m0nstar,

falls es sich nicht um sehr große Dateien handelt, man das rückwärts Suchen keinen Sinn; so wie dein Beispiel auch keinen macht.
Ein Infomationsgewinn könnte ja hier höchstens darin bestehen, zu wissen in welcher Zeile (von Hinten) der Suchbegriff steht.

Ansonsten von vorne durchlaufen und nur den letzten gefundenen merken.

Gruß
LotPings
Member: bastla
bastla Jul 05, 2010 at 10:26:25 (UTC)
Goto Top
Hallo m0nstar!

Sieh Dir "InStrRev()" an ...

Grüße
bastla
Member: m0nstar
m0nstar Jul 05, 2010 at 10:33:40 (UTC)
Goto Top
Hallo ihr beiden,

es handelt sich um große Dateien (20-30 mb groß), wo es öfters mal vorkommt das der eintrag doppelt vorkommt und dazu will ich nur das letzte ergebnis auslesen lassen...oben war ja nur ein Besipiel @ LotPings^^

@ Bastla: ich schau mal was ich unter dem begriff finden kann danke

Gruß,
m0nstar
Member: TsukiSan
TsukiSan Jul 06, 2010, updated at Oct 18, 2012 at 16:42:43 (UTC)
Goto Top
Hallo m0nstar,

wir hatten doch bei unserem letzten Beitrag
schon mal die Geschichte mit den Arrays und dem Split gehabt.
So ähnlich kannst du auch direkt auf die letzte Zeile einer Datei zugreifen.

(VBS)
1) Datei komplett öffnen (ReadAll) und die Daten splitten mit "vbcrlf"
2) dann steht im höchsten Wert des Arrays (Ubound) die letzte Zeile drinnen.
3) auf diese kannst du dann direkt zugreifen.

Kurzes Beipiel:
MeineIniDatei = "C:\TestDatei.txt"  

Set FSO = CreateObject("Scripting.FileSystemObject")  
Meinedaten = FSO.OpenTextFile(MeineIniDatei, 1).ReadAll 

AlleZeilen = Split(Meinedaten, vbCrLF)

Msgbox AlleZeilen(Ubound(AlleZeilen))

Gruss Tsuki
Member: m0nstar
m0nstar Jul 06, 2010 at 05:29:31 (UTC)
Goto Top
Hallo Tsuki,

danke dir für dein klasse Beispiel...so hab selbst ich es verstanden^^.

Ich weiß das wir drüber geredet haben aber ich war mir unsicher ob man es hier wieder anwenden kann. Vorallem das mit dem Split war mir vorher so garnicht in den Sinn gekommen.

Danke dir.

Gruß,
m0nstar
Member: bastla
bastla Jul 06, 2010 at 07:29:34 (UTC)
Goto Top
Hallo m0nstar!

Nur der Vollständigkeit halber:
Datei = "D:\Dein Text.txt"  
Suche = "hallo"  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(Datei).ReadAll
'Zeichenposition des Suchtextes feststellen (bzw 0, wenn nicht gefunden)  
P = InStrRev(T, Suche)
'gesamten Dateiinhalt an der gesuchten Position "schneiden",  
'anhand der Zeilenschaltungen zerlegen und  
' den ersten entstehenden Teilstring ausgeben  
If P > 0 Then WScript.Echo Split(Mid(T, P), vbCrLf)(0)
Einschränkung dieser Variante: Falls der Suchbegriff nicht am Anfang der Zeile steht, wird nur der Teil der Zeile ab dem letzten Auftreten des Suchbegriffes ausgegeben.

Alternative (entspricht im Prinzip LotPings Vorschlag, wobei allerdings nur "passende" Zeilen durchlaufen werden müssen):
Datei = "D:\Dein Text.txt"  
Suche = "hallo"  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(Datei).ReadAll
Set rE = New RegExp
'Suchmuster festlegen, bestehend aus:  
'    Dateianfang "^" oder "|" Zeilenende der vorigen Zeile "\r\n"  
'    keinem oder mehreren beliebigen Zeichen ".*"  
'    dem eigentlichen Suchbegriff  
'    keinem oder mehreren weiteren beliebigen Zeichen ".*" und  
'    Zeilenende "\r\n" oder "|" Dateiende "$"  
rE.Pattern = "(^|\r\n).*" & Suche & ".*(\r\n|$)"   
rE.IgnoreCase = True
rE.Global = True
'Auflistung aller Fundstellen erzeugen, ...  
Set Matches = rE.Execute(T)
'... durchlaufen, ...  
For Each Match In Matches
    '... sich jeweils die bisher letzte Fundstelle "merken" ...  
    Last = Match.Value
Next
'... und die allerletzte Fundstelle ausgeben  
WScript.Echo Last
Grüße
bastla
Member: m0nstar
m0nstar Jul 06, 2010 at 07:52:05 (UTC)
Goto Top
Hallo bastla,

ui danke...das natürlich fein um mal gute alternativen zu sehen bzw. wege wie es noch geht.

Danke, werd mich da gleich mal durchfressen.

Gruß,
m0nstar
Member: m0nstar
m0nstar Jul 07, 2010 at 09:48:49 (UTC)
Goto Top
Hallo,

habe da doch nochmal eine Frage, wenn ich nach 2 Sachen suche:

rE.Pattern = "(^|\r\n).*" & SearchPart2 & ".*" & SearchPart1 & ".*(\r\n|$)"  

Das klappt soweit super, Problem ist nur ich will in der msgbox aber nicht den kompletten Teil ausgeben, sondern nur diesen Bereich:

"(^|\r\n).*" & SearchPart1 & ".*(\r\n|$)"  

Problem ist noch, dass vor dem Suchbegriff 3 Zeichen sind die ich mit ausgeben will.

15 = Pending downloads

Und nach Pending downloads suche ich.

Ich hoffe man versteht was ich will face-big-smile

Gruß,
m0nstar
Member: bastla
bastla Jul 07, 2010 at 10:34:31 (UTC)
Goto Top
Hallo m0nstar!

Wenn ich Dein Beispiel unmittelbar umsetzen müsste, sähe das so aus:
Search = "Pending downloads"
rE.Pattern = "\d+=" & Search
Hier wird nach einer oder mehreren Ziffern, einem "=" und dem Suchbegriff lt Variable "Search" gesucht (ev Leerzeichen - Du schreibst zwar von 3 Zeichen, inkl Leerzeichen wären es allerdings 5 - musst Du noch an passender Stelle ergänzen) ...
Soferne nach mehreren Kriterien gesucht, aber nur ein Teil des Suchergebnisses reoturniert werden soll, können "SubMatches" verwendet werden - soferne ich Dich richtig interpretiere, müsste das mit dem ursprünglichen "Pattern" so zu lösen sein:
rE.Pattern = "(^|\r\n).*" & SearchPart2 & ".*" & "(\d+=" & SearchPart1 &  ")"
Zusätzlich müsste aus
Last = Match.Value
dann
Last = Match.SubMatches(1)
werden. Da die Kennzeichnung der "SubMatches" durch ein Paar runder Klammern erfolgt, liefert "Match.SubMatches(0)" wegen des Teil-Patterns "(^|\r\n)" den "Textanfang" bzw das vorhergehende "Zeilenende" - daher ist der Index "1" (= zweites Klammernpaar) zu verwenden.

Grüße
bastla
Member: m0nstar
m0nstar Jul 08, 2010 at 07:24:35 (UTC)
Goto Top
Hallo bastla,

danke mit deinen Erklärungen hilft mir das extrem weiter VBScript besser zu lernen. Vielen vielen Dank, großes Lob an dieser Stelle, auch das du mir immer hilfst wenn ich dich mal nerve face-big-smile

Gruß,
m0nstar
Member: bastla
bastla Jul 08, 2010 at 07:36:25 (UTC)
Goto Top
Hallo m0nstar!

Wie - Du nervst mich? War mir bisher gar nicht aufgefallen ... face-wink

Freut mich jedenfalls, wenn meine Vorschläge helfen. face-smile

Grüße
bastka
Member: m0nstar
m0nstar Jul 13, 2010 at 13:04:20 (UTC)
Goto Top
Hallo,

eine Frage hab ich doch noch face-big-smile

wie stell ich es den an, wenn ich eine Zeile suche und paar Zeilen drunter noch etwas suchen will?

test123
test3
test76
test123
test876
test345
test34

Jetzt will ich nach dem letzten test123 suchen und test34...es soll abern icht nur das letzte test34 sein sondern das was nach test123 kommt ausgegeben werden.

Jemand ne Idee?

Gruß,
m0nstar
Member: bastla
bastla Jul 17, 2010 at 18:47:58 (UTC)
Goto Top
Hallo m0nstar!

Ich bin mir nicht so ganz sicher, wie das gemeint ist und was gefunden werden soll - aber schematisch könnte das so aussehen:
P = InStrRev(T, "test123")  
If P > 0 Then
    R = Mid(T, P)
    'jetzt in R suchen und Ergebnis(se) weiter verarbeiten  
End If
Der Variablen R wird so der letzte Teil des gesamten Dateiinhaltes T (ab der Fundstelle des letzten "test123") zugewiesen - für Dein Beispiel oben wäre das dann:
test123
test876
test345
test34
Grüße
bastla