Hilfe! Teile aus Textdatei mit _StringBetween ausschneiden funktioniert nicht.

  • Hallo zusammen,

    ich hab mich jetzt bereits seit mehreren Stunden durch die verschiedensten Ergebnisse hier und auch im englisch-sprachigen Forum durchgewühlt, komme aber trotzdem zu keinem Ergebnis.

    Ich habe folgenden Beispieltext:

    Spoiler anzeigen

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
    eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
    voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
    clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.


    IP Location:

    Resolve Host: p2012-ipbfp301kagawa.kagawa.ocn.ne.jp
    IP Address: 122.23.133.12
    Blacklist Status: Clear

    inetnum: 122.16.0.0 - 122.31.255.255
    netname: OCN
    descr: NTT Communications Corporation
    descr: 1-6 Uchisaiwai-cho 1-chome Chiyoda-ku, Tokyo 100-8019 Japan
    country: JP
    admin-c: JNIC1-AP
    tech-c: JNIC1-AP
    status: ALLOCATED PORTABLE
    remarks: Email address for spam or abuse complaints :
    mnt-by: MAINT-JPNIC
    mnt-lower:MAINT-JPNIC
    Memberships | Support | Registrant Search | Whois | Desktop Tools | Stock Ticker | Blog | Site Map © 2010, LLC All rights reserved.


    Aus diesem möchte ich nun den Text ab Resolve Host bis einschließlich mnt-lower:MAINT-JPNIC in eine neue Textdatei schreiben lassen.
    Als Skriptansatz habe ich folgendes:

    [autoit]


    #include <String.au3>

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

    $file = FileOpen(@ScriptDir & "\temp\" & "Test.txt", 0)
    $fileread = FileRead($file)
    $Protokoll = _StringBetween($fileread, "IP Location:", "Memberships")
    FileClose($file)

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

    $file = FileOpen(@ScriptDir & "\temp\" & "Test_NEU.txt", 1)
    FileWrite(@ScriptDir & "\temp\" & "Test_NEU.txt", $Protokoll[0])
    FileClose($file)

    [/autoit]

    Die Datei Test_NEU.txt wird auch erstellt, ist aber leer.
    Mit den Begriffen "IP Location:" und "Memberships" hab ich Anfang und Ende des Textes definiert, was eigentlich auch stimmen sollte.
    Trotzdem funktioniert´s nicht.
    Kann mir jemand weiterhelfen bzw. mir sagen, was ich falsch mache?

    Danke für Eure Hilfe

    Micha

  • Hallo Mick,

    das ist ganz einfach. Wenn du schon ein Dateihandle nutzt, dann musst du es auch weiternutzen.
    Also änder mal

    [autoit]

    FileWrite(@ScriptDir & "\Test\" & "Test_NEU.txt", $Protokoll[0])

    [/autoit]


    zu

    [autoit]

    FileWrite($file, $Protokoll[0])

    [/autoit]


    um.

    Müsste dann eigentlich klappen.

  • regexp hat halt klare vorteile wenn man gut damit umgehn kann. und einziger nachteil ist egtl das es langsamer ist als z.b. die string... funktionen.

    wieso also nicht regexp verwenden

  • SEuBo: Kannst du bitte mal den ganzen StringRegExp Befehl erklären, den du geschrieben hast. Damit ich das auch endlich mal verstehe. ^^

  • SEuBo: Kannst du bitte mal den ganzen StringRegExp Befehl erklären, den du geschrieben hast. Damit ich das auch endlich mal verstehe. ^^

    Siehe meine Signatur ^^

    Das Pattern aus Post sucht zuerst nach "Resolve Host". \Q und \E geben an, dass alles dazwischen literal gesucht werden soll. Metazeichen, die spezielle Aufgaben erfüllen werden also nicht "umgewandelt". Das ist ähnlich dem Flag 1 vom Send() befehl.
    Danach kommt mindestens eins, aber unendlich viele unbekannte Zeichen "[\w\W]+".
    Alternativ könnte man auch "(?s).+" verwendet werden.
    Danach wird nach "mnt-lower:MAINT-JPNIC" gesucht; Nach dem gleichen Prinzip wie oben.

  • Ich meinte jetzt zwar diesen speziellen Befehl, aber ok, danke. Obwohl ich mir normalerweise diese dubiose Seite nicht angucke, werde ich es mir mal durchlesen.

    • Offizieller Beitrag

    und einziger nachteil ist egtl das es langsamer ist als z.b. die string... funktionen


    Nicht generell - komplexe StringRegExReplace sind deutlich schneller als vergleichbare Stringbefehl Konstrukte. Nach meiner Erfahrung nimmt vergleichsweise die Geschwindigkeit von RegExp deutlich zu, je länger der Text wird.

  • jup stimmt sry. war n bisschen zu allgemein.

    ich hatte bisher meistens eher kurze texte die ich auswerten wollte und da waren string... funktionen n gutes stückchen vorne dran.

    aber bei viel text is regexp echt besser. und auch oft viel praktischer. vor allem bei quelltexten und so

  • Wooooooow............Mann, seid ihr schnell.

    Danke m-obi, das war´s. Hat sofort geklappt, aber da wär ich vermutlich nie selbst drauf gekommen.

    SEuBo´s Lösungsansatz hab ich leider nicht wirklich kapiert, ich fürchte dafür reichen meine Kenntnisse einfach nicht aus.
    Sein StringRegExp-Tutorial hab ich mir auch mal angesehen und werd ich mir in ner ruhigen Minute sicher nochmal zu Gemüte führen. Wie detailliert man hier alles definieren kann ist auf jeden Fall ein Hammer.

    Vielen Dank für Eure schnelle Hilfe :thumbup: ihr seid echt klasse,

    Micha

  • SEuBo´s Lösungsansatz hab ich leider nicht wirklich kapiert, ich fürchte dafür reichen meine Kenntnisse einfach nicht aus.

    Ja, RegExp ist leider nichts, was man sich in 15 minuten aneignen kann. Ich hab auch ein paar Tage gebraucht, bis ich da ein bisschen durchgeblickt habe, und ich lerne immer noch fast täglich neues (zb: das mit dem \Q...\E hab ich erst (vor-)gestern in einem Script von Bugfix gelern. Aber die Möglichkeiten, die einem RegExp bietet sind unglaublich. Wie dsgamer schon sagte: Momentan kann man in jedem Script von mir Reguläre Ausdrücke finden. Quasi sind die für mich, was Arrays für BugFix sind :D

    Fürs nächste mal hab ich hier noch eine Funktion erstellt:
    (Beispiel ist dabei)

    Spoiler anzeigen
    [autoit]

    _TestDatei("erstellen")
    _FileExtract(@TempDir & "\~Extract.txt", @TempDir & "\~Extracted.txt", "Resolve Host", "mnt-lower:MAINT-JPNIC")
    _TestDatei("anzeigen")
    Func _FileExtract($sFromFile, $sToFile, $sStart, $sEnd)
    If $sFromFile = "" Or $sToFile = "" Or $sStart = "" Or $sEnd = "" Then Return SetError(1, 0, 0)
    $aTmp = StringRegExp(FileRead($sFromFile), "\Q" & $sStart & "\E[\w\W]+\Q" & $sEnd & "\E", 3)
    If IsArray($aTmp) Then Return SetError(FileWrite($sToFile, $aTmp[0]), 0, 1)
    Return SetError(1, 0, 0)
    EndFunc ;==>_FileExtract

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

    Func _TestDatei($sMode)
    Switch $sMode
    Case "erstellen"
    FileWrite(@TempDir & "\~Extract.txt", _
    "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy" & @CRLF & _
    "eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam" & @CRLF & _
    "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet" & @CRLF & _
    "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." & @CRLF & _
    @CRLF & _
    @CRLF & _
    "IP Location:" & @CRLF & @CRLF & _
    "Resolve Host: p2012-ipbfp301kagawa.kagawa.ocn.ne.jp" & @CRLF & _
    "IP Address: 122.23.133.12" & @CRLF & _
    "Blacklist Status: Clear" & @CRLF & _
    @CRLF & _
    "inetnum: 122.16.0.0 - 122.31.255.255" & @CRLF & _
    "netname: OCN" & @CRLF & _
    "descr: NTT Communications Corporation" & @CRLF & _
    "descr: 1-6 Uchisaiwai-cho 1-chome Chiyoda-ku, Tokyo 100-8019 Japan" & @CRLF & _
    "country: JP" & @CRLF & _
    "admin-c: JNIC1-AP" & @CRLF & _
    "tech-c: JNIC1-AP" & @CRLF & _
    "status: ALLOCATED PORTABLE" & @CRLF & _
    "remarks: Email address for spam or abuse complaints :" & @CRLF & _
    "mnt-by: MAINT-JPNIC" & @CRLF & _
    "mnt-lower:MAINT-JPNIC" & @CRLF & _
    "Memberships | Support | Registrant Search | Whois | Desktop Tools | Stock Ticker | Blog | Site Map © 2010, LLC All rights reserved." _
    )
    Case "anzeigen"
    ShellExecuteWait(@TempDir & "\~Extracted.txt")
    FileDelete(@TempDir & "\~Extracted.txt")
    ContinueCase
    Case "löschen"
    FileDelete(@TempDir & "\~Extract.txt")
    EndSwitch
    EndFunc ;==>_TestDatei

    [/autoit]