StringRegExp vorletzte Zeile

  • Ich muss in einer Textdatei mit folgendem Aussehen:

    Code
    abcd= 29876 xyz= 0
    abcd=  123 xyz= 945
    abcd= 4567 xyz= 345
    abcd= 8902 xy

    Die letzte Zahl zurückbekommen, die zwischen eine vollständigem "abcd=" und dem folgenden "xyz=" steht.
    In obigem Beispiel also die "4567" weil in der letzten Zeile das "xyz=" nicht vollständig geschrieben ist.

    So weit bin ich, aber wie bekommen ich den möglichen letzten Zeilenvorschub hinein ?

    [autoit]

    $return = StringRegExp($string,"abcd= (\d*) xyz=.*\Z",1)

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (24. Januar 2009 um 18:27)

  • Hier was von mir:

    [autoit]

    #Include <File.au3>
    $found = "Nicht gefunden"
    $lines = _FileCountLines("Test.txt")
    $file = FileOpen("test.txt", 0)
    While $lines > 0
    $line = FileReadLine($file, $lines)
    If StringInStr($line, "abcd=") > 0 And StringInStr($line, "xyz=") > 0 Then
    $tmp = StringSplit(StringStripWS($line, 7), " ")
    If $tmp[UBound($tmp) -1] <> "xyz=" Then
    $found = $tmp[2]
    ExitLoop
    EndIf
    EndIf
    $lines -= 1
    Wend
    FileClose($file)
    MsgBox(0, "Test", $found)

    [/autoit]

    Wobei Test.txt die Datei ist.

    Ich hoffe, dass passt!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (24. Januar 2009 um 01:11)

    • Offizieller Beitrag

    Oder ohne StrigRegExp:

    [autoit]


    $str = "abcd= 29876 xyz= 0" & @CRLF & "abcd= 123 xyz= 945" & @CRLF & "abcd= 4567 xyz= 345" & @CRLF & "abcd= 8902 xy"
    $end = StringInStr($str, ' xyz=', 0, -1)
    $start = StringInStr($str, 'abcd=', 0, -1, $end) + 6
    $out = StringMid($str, $start, $end - $start)
    MsgBox(0, 0, '"'&$out&'"')

    [/autoit]
  • Danke an alle....
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (24. Januar 2009 um 22:08)

  • Habe gerade festgestellt, das manchmal in den Zeilen noch Text folgt. Die vorher funktionierende StringRegExp-Version klappt dann wieder nicht. Kann man das noch anpassen ? Ich habe alles mögliche getestet ich bekomme einfach die Lösung nicht hin.

    [autoit]

    #include <Array.au3>
    $str = "abcd= 29876 xyz= 0 irgendwas" _
    & @CRLF & "abcd= 123 xyz= 945" _
    & @CRLF & "abcd= 4567 xyz= 345 und noch was" _
    & @CRLF & "abcd= 8902 xy"

    [/autoit][autoit][/autoit][autoit]

    $re = StringRegExp($str, 'abcd=\s+(\d+)\sxyz=\s+\d+\r\n[\w =]+$', 3)
    _ArrayDisplay($re)

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ja, ist schon klar. Ich habe es bisher immer nach ähnlichem Vorgehen gelöst.

    Mit StringRegExp() ist das ganze meist deutlich übersichtlicher. Und wie Du sicher am Titel des Thema's erkennen kannst, ging es um eine Lösung mit StringRegExp(). Auch eben um den Einsatz von regulären Ausdrücken zu erlernen, damit ich nicht immer mit StringLeft(), StringRight() und StringMid() arbeiten muss.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    • Offizieller Beitrag

    Wenn die Struktur immer so ist, sollte dieses Pattern passen:

    [autoit]

    $str = "abcd= 29876 xyz= 0 irgendwas" _
    & @CRLF & "abcd= 123 xyz= 945" _
    & @CRLF & "abcd= 4567 xyz= 345 und noch was" _
    & @CRLF & "abcd= 8902 xy"

    [/autoit][autoit][/autoit][autoit]

    $re = StringRegExp($str, '(abcd=\s+)(\d+)([w= ]+.*)\r\n', 3)
    MsgBox(0, 'Gesuchter Wert', $re[UBound($re)-2])

    [/autoit]
  • Hi,
    ich hab jetzt lange Probiert und bekomme es so wie ich es wollte wohl doch nicht hin :(.
    Aber eine einfache Möglichkeit wäre, einfach alle Strings zurückgeben zu lassen, die auf das Pattern passen und dann nur das letzte davon zu nehme. So in etwa:

    Spoiler anzeigen
    [autoit]

    $str = "abcd= 29876 xyz= 0 irgendwas" _
    & @CRLF & "abcd= 123 xyz= 945" _
    & @CRLF & "abcd= 4567 xyz= 345 und noch was" _
    & @CRLF & "abcd= 8902 xy"

    [/autoit] [autoit][/autoit] [autoit]

    $re = StringRegExp($str, 'abcd=\s+(\d+)\s+xyz=\s+\d+', 3)
    MsgBox(0,"",$re[UBound($re)-1])

    [/autoit]

    Jetzt noch zum Thema StringRegExp gegen String-Funktionen.
    Natürlich sieht SRE eleganter und professioneller :P aus.

    Aber hast du mal die Geschwindigkeiten Verglichen?
    Oscars Script z.B. ist 10x so schnell wie SRE!

    /Edit: da hat wohl jemand so eine ähnliche Idee gehabt :P.

  • Na ja, BugFix das haut aber nicht hin.

    Dein Script gibt zwar VIEL (im Array) zurück (da etliche Gruppen () definiert), aber wenn Du die letzte Zeile mal auf "abcd= 8902 xyz=" vervollständigst, kommt nicht "8902" raus !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"