Unstrukturieren Text parsen - wie ?

  • Hallo,

    ich möchte gerne aus dem Script heraus ein POP3 Konto abfragen (das geht schon). Als Ergebnis bekomme ich in einem definierten Ordner ein nicht definierte Textdatei.

    Nicht definiert heißt, der Name wird dynamisch zusammen gebaut

    Der Dateiinhalt ist auch nicht definierbar.

    Ich suche dort eine Zeile die mit

    "Subjekt:"

    anfängt. Was hinter den ":" steht, will ich in eine Variable schreiben .Der Text ist jedoch nicht immer in der gleichen Zeile.

    Ich finde sonst auch keine "Regelmäßigkeiten"

    Wie geht man sowas an.

    mit Fileopen und Fileread vermutlich, aber wie geht es weiter ...

    Beispiele wären wünschenswert :)

    Hier mal 2 Beispieltexte:

    und

    Gruss Hassan

  • [autoit]

    #include <Array.au3>

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

    _ArrayDisplay (StringRegExp (ClipGet (), 'Subject:(.+)', 3))

    [/autoit]
  • Ich habe den Code probiert, nutze aber auch die alte AutoIt-Version... Kann gut sein, dass es so nicht mehr funktioniert.
    Da stellt sich mir nur die Frage; wieso?
    Irgendwie verstehe ich denn Sinn und Zweck dahinter nicht.

  • Bei ArrayDisplay wird das Array per ByRef übergeben.
    Das heißt also keine Kopie erzeugt mit welcher dann intern gearbeitet wird sondern nur ein Verweis.
    Einfach ausgedrückt führt das dazu dass die StringRegEx zwar ein Array erzeugt und das kurz an ArrayDisplay übergibt aber dann sofort wieder verwirft da es ja nicht in einer Variable gespeichert wird.
    Daher führt der Verweis mit dem ArrayDisplay arbeitet ins Leere.

    Kurz: Entfernt man das ByRef aus ArrayDisplay funktioniert es wieder.

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    $sPop3 = _
    'Received: by s1.vhs.local ' & @CRLF & _
    ' id <01CD6422.821DCACA@s1.vhs.local>; Tue, 17 Jul 2012 15:46:03 +0200' & @CRLF & _
    'Return-Receipt-To: "it" <[email='it@lala.de'][/email]>' & @CRLF & _
    'Content-class: urn:content-classes:message' & @CRLF & _
    'Subject: Test123' & @CRLF & _
    'MIME-Version: 1.0' & @CRLF & _
    'Content-Type: multipart/alternative;' & @CRLF & _
    ' boundary="----_=_NextPart_001_01CD6422.821DCACA"' & @CRLF & _
    'Date: Tue, 17 Jul 2012 15:46:01 +0200' & @CRLF & _
    'Message-ID: <114753C5767DF54A90285C5A1A10A3A3021A52@s1.vhs.local>' & @CRLF & _
    'Disposition-Notification-To: "it" <[email='it@lala.de'][/email]>' & @CRLF & _
    'X-MimeOLE: Produced By Microsoft Exchange V6.5' & @CRLF & _
    'X-MS-Has-Attach: ' & @CRLF & _
    'X-MS-TNEF-Correlator: ' & @CRLF & _
    'Thread-Topic: Test123' & @CRLF & _
    'thread-index: Ac1kInwC5AN8zIg8RJ6OA9xctXvurg==' & @CRLF & _
    'From: "it" <[email='it@lala.de'][/email]>' & @CRLF & _
    'To: "bubu" <[email='bubu@lala.de'][/email]>'
    $sParse = StringRegExpReplace($sPop3, "(?im)[\s\S]*?Subject:\s*(.*)(?s).*", "$1")
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$sParse' & @lf & @lf & 'Return:' & @lf & $sParse) ;### Debug MSGBOX

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Servus,

    sorry das ich mich erst jetzt wieder melde, hatte ein paar Tage leider keine Zeit.

    Bin etwas verzweifelt. Hier mal ein wenig Code

    Funktion POP Abruf
    [autoit]

    _POP3

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

    Func _POP3()
    If Not FileExists(@TempDir & "\PapaControl\received") Then; Prüfung ob Verzeichnis existiert
    DirCreate(@TempDir & "\PapaControl\received"); ... wenn nicht, dann Verzeichnis anlegen
    EndIf; Ende der Schleife
    ;Run(@TempDir & "\PapaControl\popclient.exe -configfile mypop3.xml", @TempDir & "\PapaControl\", @SW_HIDE); Die Email wird abgerufen
    FileChangeDir(@TempDir & "\PapaControl\received"); Ins Verzeichnis wechseln, wo das erzeugte Textfile liegt
    Local $search = FileFindFirstFile("*.*"); Nach Dateinamen im Verzeichnis suchen

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

    While 1
    Local $file = FileFindNextFile($search)
    If @error Then ExitLoop; wenn Fehler, dann verlasse die Schleife
    ConsoleWrite("gefundener Dateiname: " & $file & @CRLF); gib den gefundenen Dateinamen auf der Console aus - zu Kontrollzwecken
    Local $opendfile = FileOpen($file); öffne die Datei, welche gefunden wurde
    FileRead($opendfile); lese die Datei, die geöffnet wurde
    MsgBox(0, '$opendfile ist: ', $opendfile); gib den Inhalt der gelesenen Datei aus
    ;Local $aArray1 = _StringBetween($opendfile, 'Subject:', @CRLF)
    ;_ArrayDisplay($aArray1, 'Standardsuche')
    ;FileClose($opendfile)
    WEnd
    ; Close the search handle
    ;FileClose($search)
    ;FileDelete(@TempDir & "\PapaControl\received\*.txt")
    EndFunc ;==>_POP3

    [/autoit]

    In Zeile 14 wird der gefundene Dateinamen ausgegeben, aber Zeile 15 bis 17 macht nicht das, was ich mir erhoffte. Ich wollte sozusagen das Textfile öffnen und lesen und "komplett" in einer MsgBox ausgeben, damit ich erst mal sicher bin, das richtige "Ziel" zu haben. Im nächsten Step würde ich dann mit dem _StringBetween weitermachen.

    Wo biege ich hier falsch ab ?

    Gruss Hassan

  • FileRead gibt den gelesen Inhalt als Rückgabewert zurück.
    Den ignorierst du aber komplett.
    Stattdessen lässt du dir das per FileOpen geöffnete DateiHandle ausgeben welches in $opendfile steht.

    Prinzipiell: Wenn du die komplette Datei einlesen willst reicht ein FileRead mit Pfadangabe. FileOpen brauchst du dann nicht.

  • Hallo AspirinJunkie,

    Danke für die Antwort. Ich habe meinen Fehler gefunden, jedoch habe ich jetzt noch folgendes Problem (anbei nochmals der überarbeitete Code)

    Funktion POP Abruf
    [autoit]

    Func _POP3()
    If Not FileExists(@TempDir & "\PapaControl\received") Then; Prüfung ob Verzeichnis existiert
    DirCreate(@TempDir & "\PapaControl\received"); ... wenn nicht, dann Verzeichnis anlegen
    EndIf; Ende der Schleife
    ;Run(@TempDir & "\PapaControl\popclient.exe -configfile mypop3.xml", @TempDir & "\PapaControl\", @SW_HIDE); Die Email wird abgerufen
    FileChangeDir(@TempDir & "\PapaControl\received"); Ins Verzeichnis wechseln, wo das erzeugte Textfile liegt
    Local $search = FileFindFirstFile("*.*"); Nach Dateinamen im Verzeichnis suchen

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

    While 1
    Local $file = FileFindNextFile($search)
    If @error Then ExitLoop; wenn Fehler, dann verlasse die Schleife
    ConsoleWrite("gefundener Dateiname: " & $file & @CRLF); gib den gefundenen Dateinamen auf der Console aus - zu Kontrollzwecken
    $opendfile = FileRead($file); lese die Datei, die geöffnet wurde
    ;MsgBox(0, '$opendfile ist: ', $opendfile); gib den Inhalt der gelesenen Datei aus
    Local $aArray1 = _StringBetween($opendfile, 'Subject: ', @CRLF); Sucht den String zwischen Anfangs und Endwert
    _ArrayDisplay($aArray1, 'Standardsuche'); Gibt das Ergbnis zurück
    FileClose($opendfile); Schließt die Datei
    WEnd
    ; Close the search handle
    ;FileClose($search)
    ;FileDelete(@TempDir & "\PapaControl\received\*.txt")
    EndFunc ;==>_POP3

    [/autoit]


    In Zeile 16 wird der Inhalt des Array ja angezeigt, nach dem Schema

    Code
    [0]|test123


    Ich will das Ganze in einer Variablen haben, in der aber nur

    Code
    test123


    steht.

    Geht das mit einfachen Hausmitteln, oder muss hier der String nochmals bearbeitet werden ?

    P.S. Habe es selbst gefunden :)

    [autoit]

    Local $myemailsubjekt = _ArrayToString($aArray1)
    MsgBox(0, "Betreff ist: ", $myemailsubjekt)

    [/autoit]

    Gruss Hassan

    Einmal editiert, zuletzt von HassanMullah (20. Juli 2012 um 13:33)