letzte Zeile eines String auslesen

  • Wie die Überschrift sagt möchte ich gerne die letzte Zeile eines Strings in einem Eingabefeld anzeigen.

    Jetzt habe ich schon einige Möglichkeiten versucht und mich auch mit StringRight, StringInStr, etc. herumgespielt.

    Leider bekomme ich kein brauchbares Ergebnis. Der Inhalt des Strings sieht so aus:

    Das "228 blocks free." hätte ich dann gerne herausgefiltert. Am Ende jeder Zeile wird noch ein <LF> mitgeschickt.
    Das Problem ist das die unterste Zeile nicht immer gleich lang ist, da die Zahl 1, 2 oder 3-stellig sein kann.

    Folgendes habe ich schon versucht:

    [autoit]


    $dir_free = StringUpper(StringRight($dir, StringInStr($dir, @LF, 0, 1)))

    [/autoit]

    Das Ergebnis sieht dann aber so aus:

    Code
    .-" DEL 228 BLOCKS FREE.

    Obwohl nach dem "DEL" eindeutig ein <LF> kommt, wird dieses einfach ignoriert. Stattdessen fängt er irgendwo in der vorletzten Zeile an zu zählen.

    Warum?

  • Hallo DerSchatten,

    hier 2 Lösungsmöglichkeiten:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

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

    Global $aDirList
    _FileReadToArray(@ScriptDir & "\DirListing.txt",$aDirList)

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

    MsgBox(0,"Lösung bei Zeihlenanzahl in Elemnt 0", $aDirList[$aDirList[0]])

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

    _ArrayDelete($aDirList,0)
    MsgBox(0,"Lösung wenn Elemnt 0 bereits ein Dateieintrag", $aDirList[UBound($aDirList)-1])

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

    um das Beispiel zu testen benötigst du: autoit.de/wcf/attachment/13931/ In deinem echten Programm erzeugst du dir das Array sicherlich anders,

    mfg autoBert

  • Das Beispiel von name22 bringt mir leider überhaupt kein Ergebnis. Wenn ich es richtig verstanden habe müßte es bei mir dann so aussehen:

    [autoit]

    StringRegExp($dir, @LF, 3)

    [/autoit]

    Leider kann ich die anderen beiden Beispiele nicht anwenden, weil meine Daten in einem String liegen und in keinem Array.

    Was mir jedoch seltsam vorkommt ist, das folgendes einfaches Beispiel ebenfalls nicht funktioniert:

    [autoit]


    $dir = "Das ist ein übler % test der mit 21% gemacht wird"
    $result = StringRight($dir, StringInStr($dir, "%", 0, -1))
    MsgBox(0, "Ergebnis:", $result)

    [/autoit]

    Eigentlich sollte das Ergebnis doch so lauten:

    "% gemacht wird"

    Stattdessen kommt sowas dabei raus:

    "bler % test der mit 21% gemacht wird"

    Ist da ein Bug drinn?

  • Hallo DerSchatten,

    ein Array lässt sich mit

    [autoit]

    StringSplit

    [/autoit]

    ganz leicht erzeugen, aber ich habe noch ein Beispiel mit StringMid angehängt (den String bastel ich mir vorher zusammen, dies benötigst du nicht) :

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

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

    Global $aDirList
    _FileReadToArray(@ScriptDir & "\DirListing.txt",$aDirList)

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

    MsgBox(0,"Lösung bei Zeihlenanzahl in Elemnt 0", $aDirList[$aDirList[0]])

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

    _ArrayDelete($aDirList,0)
    MsgBox(0,"Lösung wenn Elemnt 0 bereits ein Dateieintrag", $aDirList[UBound($aDirList)-1])

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

    $sDir = ""
    for $i = 0 to UBound($aDirList) - 1
    $sDir &= $aDirList[$i]
    if $i < UBound($aDirList) - 1 Then $sDir &= @LF
    Next

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

    ConsoleWrite($sDir)

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

    $sDirFree = StringUpper(StringMid($sDir, StringInStr($sDir, @LF, 0, -1)))

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

    MsgBox(0,"Deine Lösung",$sDirFree)

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (13. August 2011 um 00:00)

  • Zitat

    Das Beispiel von name22 bringt mir leider überhaupt kein Ergebnis. Wenn ich es richtig verstanden habe müßte es bei mir dann so aussehen:


    Nein, du hast es nicht richtig verstanden... Es müsste so aussehen:

    [autoit]

    $aResult = StringRegExp($dir, '(.+)\z', 3)
    MsgBox(64, "Result", $aResult[0])

    [/autoit]
    Zitat

    Leider kann ich die anderen beiden Beispiele nicht anwenden, weil meine Daten in einem String liegen und in keinem Array.


    Sie müssen auch nicht in einem Array sein, du verwechselst den Rückgabewert mit den Parametern. Die Funktion gibt ein Array zurück, aber es wird dennoch ein String als erster Parameter verwendet.

  • So funktioniert:

    [autoit]

    $dir = "Das ist ein übler % test der mit 21% gemacht wird"
    $result = StringMid($dir, StringInStr($dir, "%", 0, -1))
    MsgBox(0, "Ergebnis:", $result)

    [/autoit]

    Dein Problem liegt daran, das StringRight() zwar mit "-1" von rechts sucht, aber die Position vom Anfang (heisst von links) als Integer zurückgibt.
    Wenn Du nun StringRight() verwendest erhälts Du einen zu langen String, der aber von Rechts ist.

    Entweder nutzt Du StringMid() (ohne dritten Parameter bekommst Du den gesamten Rest) oder Du nutzt StringRight(), musst dann aber als zweiten Parameter "StringLen($dir) - StringInStr($dir, "%", 0, -1) + 1" verwenden.

    Edit:
    Für Dein Ausgangsbeispiel in Post #1 müsste es dann so klappen:

    [autoit]

    $dir_free = StringUpper(StringMid($dir, StringInStr($dir, @LF, 0, -1) + 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"