Zeile mit FileReadLine einlesen, nur bestimmte Werte in txt schreiben

  • Hallo zusammen,

    ich stehe wieder vor einem Problem.

    Ich habe hier eine *.htm Datei in der mich 3 Zeilen interessieren.

    Diese lese ich mit FileReadLine ein und kann diese dann auch in eine txt schreiben.

    Nur möchte ich ja nicht das Zeug drumherum haben sondern nur die Daten die ich wirklich brauche.

    Kleines Beispiel:

    Code
    <p class="fname">Name<p class="spotft">Strasse, wird nicht gebraucht, PLZ&nbsp;Ort<br> 
    Tel: 0123456-789,<br></p> 
    <p class="spotft"><a href="mailto:Email@Adresse<br>


    Der Code:

    [autoit]

    #include <array.au3>
    #include <string.au3>
    $sText = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",82)
    $sText2 = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",83)
    $file = FileOpen("C:\Users\testuser\Documents\Folder\test.txt", 1)
    Sleep(3000)
    FileWrite($file,@CR)
    FileWrite($file, @CRLF & $sText)
    FileWrite($file,@CR)
    FileWrite($file, @CRLF & $sText2)

    [/autoit]


    Gruß Norman

  • Danke für deine Antwort

    Habe das jetzt wie folgt abgeändert leider funktioniert es nicht.

    Was habe ich falsch gemacht?


    [autoit]

    Global $aResult, $file, $i, $sString, $sText, $sText2

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

    $sText = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",82)
    ;~ $sText2 = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",83)
    ;~ $file = FileOpen("C:\Users\testuser\Documents\Folder\test.txt", 1)
    $aResult = StringRegExp($sText, '"fname">(.*?)<.*?"spotft">(.*?)<br>.*?Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1,1)
    For $i = 0 To UBound($aResult) -1
    ConsoleWrite($aResult[$i] & @CRLF)
    Next

    [/autoit]
  • Habe es sowohl mit

    [autoit]

    $aResult = StringRegExp($sString, '"fname">(.*?)<.*?"spotft">(.*?)<br>.*?Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1,1)

    [/autoit]

    wie auch mit

    [autoit]

    $aResult = StringRegExp($sText, '"fname">(.*?)<.*?"spotft">(.*?)<br>.*?Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1,1)

    [/autoit]

    probiert.

    Nur worauf bezieht sich $sString?

  • Sorry wirklich...aber Blick es nicht.


    Der Code sieht jetzt wie folgt aus:

    [autoit]

    #include <array.au3>
    #include <string.au3>
    Global $sText, $aResult, $file, $sString
    $sText = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",82 & 83)
    $file = FileOpen("C:\Users\testuser\Documents\Folder\test.txt", 1)
    Sleep(3000)
    $aResult = StringRegExp($sString, '(?s)"fname">(.*?)<.*?"spotft">(.*?)<br>.*?Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1,1)
    For $i = 0 To UBound($aResult) -1
    ConsoleWrite($aResult[$i] & @CRLF)
    Next

    [/autoit]


    Woher bekommt $sString seinen Wert?

  • Ein Blick in die Hilfe hätte nochmal bestätigt, was ich oben schrieb - der zu durchsuchende String. Also das, was du in $sText hast.

    [autoit]

    #include <array.au3>
    #include <string.au3>
    Global $sText, $aResult, $file, $sString
    $sText = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",82)
    $sText &= FileReadLine("C:\Users\testuser\Documents\Folder\test.htm",83)
    Sleep(3000)
    $aResult = StringRegExp($sText, '(?s)"fname">(.*?)<.*?"spotft">(.*?)<br>.*?Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1,1)
    For $i = 0 To UBound($aResult) -1
    ConsoleWrite($aResult[$i] & @CRLF)
    Next

    [/autoit]
  • Also StringRegExp finde ich viel besser als die Idee die ich dir jetzt vorstellen werden.
    Lass dir die Zeile für jede Sache ausgeben: Name Adresse usw.
    Und arbeite dann mit:
    StringTrimLeft
    StringTrimRight
    StringLeft
    StringRight

    ist auf jeden Fall unschöner als die Idee von i2c aber du kannst es mal versuchen

    :thumbup:

  • Bitte mal ausführen und und Konsole beobachten:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <string.au3>
    Global $sText, $aResult, $file, $sString
    $sText = FileReadLine("C:\Users\testuser\Documents\Folder\test.htm", 82)
    $sText &= FileReadLine("C:\Users\testuser\Documents\Folder\test.htm", 83)
    ConsoleWrite("$sText: " & $sText & @CRLF)
    Sleep(3000)
    $aResult = StringRegExp($sText, '(?s)"fname">(.*?)<(?:.*?)"spotft">(.*?)<br>(?:.*?)Tel:(.*?),<br>.*?mailto:(.*?)<br>', 1, 1)
    If IsArray($aResult) Then
    For $i = 0 To UBound($aResult) - 1
    ConsoleWrite($aResult[$i] & @CRLF)
    Next
    Else
    ConsoleWrite("$aResult ist kein Array" & @CRLF)
    EndIf

    [/autoit]
  • Danke.

    So leid es mir tut aber ich möchte gern noch was fragen. :S
    Ich möchte es ja auch verstehen :D

    Zu dieser Zeile

    [autoit]

    $aResult = StringRegExp($sText, '(?s)"fname">(.*?)<(?:.*?)"spotft">(.*?)<br>(?:.*?)Tel:(.+?)<br>', 1, 1)

    [/autoit]

    (?:.*?) Erstellt eine "Zeile" im Array bzw. erstellt den Eintrag im Array in einer neue Zeile?
    Habe ich das so richtig verstanden?

    Wenn ja wo und wie muss ich das setzen um PLZ und Ort in die nächste Zeile im Array zu schreiben?
    Momentan sieht es folgendermaßen aus:
    Strasse, PLZ &nbsp; Ort


    Danke und Gruß
    Norman

  • (?:.*?) findet alle Zeichen, zeichnet diese aber nicht im Ergebnis-Array auf.

    Wenn PLZ und Ort immer durch ein Komma getrennt werden, könnte das so aussehen:

    [autoit]

    '(?s)"fname">(.*?)<(?:.*?)"spotft">(.*?),(.*?)<br>(?:.*?)Tel:(.+?)<br>'

    [/autoit]


    Dafür muss aber auch wirklich immer das Komma vorhanden sein, sonst geht es schief.

    Du könntest alternativ auch einfach nachträglich den String im Arrayelement per StringSplit() am Komma teilen.