Zeichenfolge finden in einer Textdatei und 'kopieren' in eine Variable zur Weiterverwendung

  • Hallo zusammen,

    irgendwie drehe ich mich immer wieder im Kreis und komme nicht weiter.

    Folgendes 'Problem' habe ich:

    Ich habe ein Log File das mehrmals am Tag geschrieben wird und immer unterschiedlich groß ist und auch unterschiedliche Inhalte hat.

    Die letzten Zeichen des FIles liegen immer in der Form s.u. vor.

    (Anmerkung: ‚¬|- diese Zeichenfolge kommt oft vor, sodass suchen nach dieser nicht das gewünschte Ergebnis bringt)

    ----> "‚¬|vX.YY.ZZZZ" <-----

    Aus diesem 'String' benötige ich jetzt nur den Teil "X.YY".

    Meine Frage ist es, was man wirklich Schlaues tun kann um das Ergebnis zu erhalten

    z.B: Suche nach String ‚¬|v?(wildcard).?(wildcard)?(wildcard)

    (natürlich kann ich das File einlesen und mich dann durchhangeln. Das ist aber ziemlich langsam - befürchte ich)

    Danke schon mal im voraus :thumbup::thumbup:

  • Dafür kannst du reguläre Ausdrücke verwenden, bspw. mit StringRegExp.

    Du übergibst ein Muster wonach gesucht werden soll und es werden dir die entsprechenden Funde zurückgegeben.

    Hier mal ein kleines Beispiel: https://regex101.com/r/zFIXiC/1/

    Nichtsdestotrotz wird hier die gesamte Datei durchgescannt werden, in welchem Größenbereich bewegst du dich denn, dass du dir Sorgen darüber machst?

    Wenn sich der Teil den du suchst immer am Ende befindet (das konnte ich aus deiner Beschreibung nicht ganz nachvollziehen), dann kannst du auch einfach die Datei mit FileOpen öffnen, mit FileSetPos an die entsprechende Position springen und dort einfach auslesen, das geht rasend schnell.

  • Hallo zusammen,

    danke für die schnellen Antworten.

    zu den Rückfragen:

    Zeichen Position: ja das sind immer die letzten 13 Zeichen des Files

    Grössenordnung des jeweiligen Log Files: die Files sing zw. 4 und 7 GB gross

    Art der Zeichen: es sind immer Zahlen (X, YY)


    Das mit mit 'FileSetPos an die entsprechende Position springen' klingt gut - das schaue ich mir dann mal genauer an

    Gruss

    ugt100

  • Somit kriegste schonmal deinen gewünschten Wert... vorausgesetzt X ist immer 1 stellig und YY 2 stellig

    ürde man ein weiteres X vor dem . setzen, würde dieser Pattern trotzdem nur X.YY bringen. Hier gibt es echt spitzenmäßige Pattern-Bauer die es besser könnten...

    Spoiler anzeigen
    Code
    #include <array.au3>
    $string = "‚¬|vX.YY.ZZZZ"
    
    $test = StringRegExp($string, "[a-zA-Z0-9]{1}.[a-zA-Z0-9]{2}", 2)
    _ArrayDisplay($test)
  • in welchem Größenbereich bewegst du dich denn, dass du dir Sorgen darüber machst?

    sind denn im String in den Werten X.YY zahlen oder Buchstaben? Oder beides?

    Hallo ugt100 !

    Erstelle und poste doch bitte einfach ein Logfile. Vertrauliche Angaben (sofern vorhanden) kannst Du mit xxx übertippen - es geht nur um den Aufbau. Wie Du an den o.a. Fragen erkennst, ist es für Helfer unnötig mühsam und zeitaufwändig, wenn man erst mal 10 Beiträge lang herumraten, bzw. eine Testdatei selbst erstellen muss.

    Edit : 4-7 GB =O. Dann mache einen Dummy bis max. 1 MB

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich denke mal, so meint er das...

    2 Mal editiert, zuletzt von Bitnugger (4. Dezember 2018 um 15:56)

  • Die letzten Zeichen des FIles liegen immer in der Form s.u. vor.

    (Anmerkung: ‚¬|- diese Zeichenfolge kommt oft vor, sodass suchen nach dieser nicht das gewünschte Ergebnis bringt)

    Diese Aussage ist für mich zumindest missverständlich.

    "Immer nur (einmal) am Ende" ODER "Die Zeichenfolge kommt oft vor" ?

    EDIT :

    Zeichen Position: ja das sind immer die letzten 13 Zeichen des Files

    Ok, das wäre gelöst !

    Zu : StringRegExp($sLogFile ...

    Liegt die max. Länge eines Strings nicht bei 2,147,483,647 ?

    siehe : https://www.autoitscript.com/autoit3/docs/a…itsDefaults.htm

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (4. Dezember 2018 um 16:45)

  • Zu : StringRegExp($sLogFile ...


    Liegt die max. Länge eines Strings nicht bei 2,147,483,647 ?

    siehe : https://www.autoitscript.com/autoit3/docs/a…itsDefaults.htm

    Das ist kein Problem, angenommen die Zeichenkette könnte mittendrin auftauchen, kann man das ganze so lösen.

    Das ist jetzt kein wirklich guter Code, ich hab den so aus dem Kopf im Browser getippt aber die Idee kommt denke ich rüber.

    Datei öffnen, max. Länge einlesen und parsen, wenn nichts gefunden wird und wir nicht am Ende sind, -13 Zeichen zurückspringen (falls es wir genau in der Mitte abgeschnitten haben) und neuen Teil parsen.

  • Liegt die max. Länge eines Strings nicht bei 2,147,483,647 ?

    Ja, das Logfile dürfte also nicht größer als 1, 99 GB sein...

    So, wie alpines es gezeigt hat, ist es quasi egal, wie groß das Logfile ist - wenn es aber nicht mehr als 16777216 Zeilen hat, geht es auch so:

  • Hallo ugt100 !

    dann kannst du auch einfach die Datei mit FileOpen öffnen, mit FileSetPos an die entsprechende Position springen und dort einfach auslesen, das geht rasend schnell.

    Das mit mit 'FileSetPos an die entsprechende Position springen' klingt gut - das schaue ich mir dann mal genauer an

    Ich habe zum Testen eine große Textdatei generiert :

    Dateigröße = 10,2 GB

    Anzahl der Zeilen = 10.485.761 (jeweilige Länge 1000 Zeichen)

    Dann wie alpines vorgeschlagen hat :

    - die Datei mit FileOpen($hFileOpen) geöffnet

    - die Position gesetzt ( -13 Zeichen vor dem Dateiende) mit : FileSetPos($hFileOpen, -13, $FILE_END)

    - und mit FileRead($hFileOpen) die letzten 13 Zeichen gelesen und korrekt erhalten

    Das geht wirklich rasend schnell (im Millisekunden-Bereich) !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Wenn nur die letzte Zeile ausgewertet werden soll, dann geht es auch so:

    Code
    Local $sLogFileName = 'Logfile.txt', $sLogFile = _
        'BlablaBla' & @CRLF & _
        '----> "‚¬|vX.YY.ZZZZ" <-----' & @CRLF
    If Not FileExists($sLogFileName) Then FileWrite($sLogFileName, $sLogFile)
    
    Local $sMatch = StringMid(FileReadLine($sLogFileName, -1), 12, 4)
    ConsoleWrite('$sMatch = ' & $sMatch & @CRLF)
  • Hi Bitnugger !

    Wenn nur die letzte Zeile ausgewertet werden soll, dann geht es auch so:

    Deine Variante dauert bei großen Dateien aber deutlich länger. Probiere mal meinen Testcode.

    - Beim ersten Mal muss _GenerateBigFile() einkommentiert werden, damit das File angelegt wird.

    - _ReadFile() ist die Variante mit FileSetPos.

    - _ReadFile2() ist deine Variante mit FileReadLine

    Edit :

    Ach ja, StringMid habe ich weggelassen, aber das hat keinen Einfluss auf die Laufzeit. Es geht um FileReadLine. Die Auswertung einer bereits gefundenen einzelnen Zeile dauert ja nicht lange.

    (Der Code ist nur schnell zusammengestoppelt - also bitte keine Schönheitskritik 8o)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (5. Dezember 2018 um 00:36)

  • Guten morgen zusammen,

    vor allen einen Dank für die Unterstützung.

    Die Kuh ist vom Eis - mittels FileOpen + FileSetPos (Vorschlag von Alpines)

    Der Grund ist die Tatsache, dass sich der gesuchte String immer am Ende des Files (letzten 13 Zeichen mit bekanntem Muster) zu suchen/finden ist.

    Ein (für mich) zweiter Effekt ist das RegEx Pattern ("‚¬\|v(.+\..+)\..+', 3) - das kann ich als 'Schablone' für diverse Suchen einsetzen - Ein sehr willkommener Nebeneffekt !:):):)

    Also allen nochmals vielen Dank für die kompetente, schnelle und verständliche Hilfe

    Gruss

    ugt100

    :thumbup::thumbup::rock::thumbup::thumbup: