FileReadLine Schleife

  • Hi,

    ich benötige eine Schleife die in einer Textdatei Zeile für Zeile nach einem bestimmten Wort sucht und dann wenn es die Zeile gefunden hat die nächste Zeile einliest und als variable speichert, allerdings hängt sich mein code irgendiwe immer auf und er gibt überhaupt keine messagebox aus zum überprüfen...ich steh grad vol auf dem schlauch...
    hier mal der code:


    das dazugehörige textfile:

    hoffe ihr könnt mir helfen.
    mfg albeck

    5 Mal editiert, zuletzt von Albeck (21. Dezember 2010 um 09:04)

  • [autoit]

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

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

    Local $aFile
    _FileReadToArray("C:\mailempfaenger.txt", $aFile)

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

    MsgBox(0, "Entwurf", $aFile[_ArraySearch($aFile, "Entwurf", 0, 0, 0, 1) + 1])
    MsgBox(0, "Vorschau", $aFile[_ArraySearch($aFile, "Vorschau", 0, 0, 0, 1) + 1])

    [/autoit]
  • [autoit]

    $workflowtype = "Vorschau:"
    $file = FileOpen(@ScriptDir & "\mailempfaenger.txt", 0)

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

    Local $result
    While 1
    If @error Then ExitLoop
    If $result == $workflowtype Then
    $result = FileReadLine($file)
    ExitLoop
    EndIf
    $result = FileReadLine($file)
    WEnd
    MsgBox(0, "test", "schleifenende")
    MsgBox(0, "test2", $result)

    [/autoit]

    Edit: zu langsam...

    • Offizieller Beitrag
    [autoit]

    $workflowtype = "Vorschau"
    $file = FileOpen("C:\mailempfaenger.txt", 0)
    Select
    Case $workflowtype = "Entwurf"
    Do
    $String = FileReadLine($file)
    Until StringInStr($String, "Entwurf")
    MsgBox(0, "test", "schleifenende")
    $1234 = FileReadLine($file)
    MsgBox(0, "test2", $1234)
    Case $workflowtype = "Vorschau"
    Do
    $String = FileReadLine($file)
    Until StringInStr($String, "Vorschau")
    MsgBox(0, "test", "schleifenende")
    $1234 = FileReadLine($file)
    MsgBox(0, "test2", $1234)
    EndSelect

    [/autoit]
  • Hm eigentlich wollte ich das ziemlich simpel halten und keine Arrays dafür verwenden...
    Außerdem wollte ich ja dann die nächste Zeile der Textfiles ausgeben lassen, wenn eine Übereinstimmung gefunden wurde.
    Deswegen kann man nicht meinen Code einfach debuggen ohne gleich komplett neuen Code zu schreiben oder geht das nicht anderst?
    Hab ich einen denkfehler in meiner Schleife, würde es gerne bei Case Select belassen

    MfG Albeck

    Edit: Ohei, das ging jetzt schnell, mal die andern Lösungsvoschläge testen ;) Danke

  • Naja du kannst es schon bei Select Case belassen (siehe Post von Raupi) allerdings ist es unschön da dann ettliches doppelt vorhanden ist (unsauberer Programmierstil, am besten garnicht erst angewöhnen)

  • Hi!


    Nach deinem Beispiel (Einfach)

    [autoit]

    Do
    ;FileReadLine("C:\mailempfaenger.txt")
    $Such = FileReadLine("C:\mailempfaenger.txt")
    If @error = -1 Then ExitLoop
    Until StringInStr($Such, 'Vorschau:', 1)

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

    MsgBox(0, 0, $Such)

    [/autoit]

    Lg Kleiner

  • Nein man müsste dein Skript schon ziemlich anpassen da das Select eigentlich keinen Sinn macht.
    Nur weil Arrays vorkommen wird es auch nicht unbedingt komplizierter.
    Ich hätte dein Skript folgendermaßen umgeschrieben:

    Spoiler anzeigen
    [autoit]

    Global Const $workflowtype = "Entwurf:"
    Global $line
    Global $file = FileOpen("C:\mailempfaenger.txt",0)
    If $file = -1 Then Exit

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

    Do
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    If $line = $workflowtype Then
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    MsgBox(0,$workflowtype, $workflowtype & ": " & $line)
    ExitLoop
    EndIf
    Until 0

    [/autoit]
  • Kleiner
    das klappt so nicht, du musst das File erstmal öffnen und dann würdest du immernoch nicht die nächste Zeile nach "Vorschau:" bekommen wie gewollt

  • Hi!


    Ist ja auch nur ein anregung! ;)

    [autoit]

    $file = FileOpen("C:\mailempfaenger.txt", 0)
    $i = 0
    Do
    $Such = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $i += 1
    Until StringInStr($Such, 'Vorschau:', 1)

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

    MsgBox(0, 0, FileReadLine($file, $i + 1))

    [/autoit]

    Lg Kleiner

  • Hi ihr alle,

    ich hab mich jetzt für Raupis Lösung entschieden. Find ich so am einfachsten und sehr übersichtlich.
    Trotzdem sehr interresant mit wieviel verschiedenem Code man doch zum gleichen Ergebnis kommt 8o

    Aber warum solte ich denn laut der allgemeinen Meinung hier leiber mit Arrays arbeiten? Und warum macht Case in deisem Fall keinen Sinn.
    Die Abfrage läuft genau ein einziges Mal in dem Skript, deswegen ...naja mit Schleife ist es natürlich kürzer aber...
    Hm vllt könnt ihr mir das noch kurz genauer erläutern warum und wiso das so mit case "unsauber" ist.

    Danke an Alle
    MfG Albeck

  • warum solte ich denn laut der allgemeinen Meinung hier leiber mit Arrays arbeiten?

    Sagt keiner dass du das sollst. Es wurde als eine Lösung vorgeschlagen welche kürzer als alle anderen Lösungen ist. Es wurde von mir nur nochmal angesprochen da du diese Lösung pauschal abgelehnt hast weil du meintest es wird automatisch mit Arrays unübersichtlich wird obwohl sie kürzer ist als alle anderen vorgestellten Lösungen.

    Und warum macht Case in deisem Fall keinen Sinn.
    Die Abfrage läuft genau ein einziges Mal in dem Skript, deswegen [...]
    Hm vllt könnt ihr mir das noch kurz genauer erläutern warum und wiso das so mit case "unsauber" ist.

    Weil in jedem Zweig immer der selbe Code steht und damit auch sowieso immer das selbe gemacht wird. Es ist eine unnötige Codeverdopplung. Wird dann noch krasser wenn du außer "Entwurf" und "Vorschau" noch mehr Sektionen hinzunehmen willst.
    Außerdem bist du damit unflexibel da du bei jedem Wort was du hinzunehmen/ändern willst den Code ändern musst anstatt z.B. diese Keywords außerhalb z.b. in eine ini-Datei schreiben könntest.

    ...naja mit Schleife ist es natürlich kürzer aber...

    In unseren Vorschlägen sind sogar weniger Schleifen als in deiner. Alles was der Unterschied zu deinem Select-Case-Konstrukt ist, ist dass wir das Keyword durch eine Variable ersetzt haben.
    Eine zusätzliche Schleife kann ich nirgends erkennen.

    Einmal editiert, zuletzt von AspirinJunkie (20. Dezember 2010 um 12:07)

  • Da du so Code doppelt hast (zb das auslesen der txt) und das ist einfach unschön, im idealfall macht man eine Funktion um das File auszulesen aber so kannst du einfach mal fast die hälfte einsparen wenn du eine Schleife nimmst und es ist viel schneller erweiterbar.

    Stell dir mal vor du hättest jetzt noch 3-4 Schlüsselwörter zum suchen; würde ewig groß werden mit select case und 80% davon wären doppelt und dreifach; mit einer Schleife hingegen bleibt alles nur einmal vorhanden und ist grenzenlos erweiterbar

    Falls du jemals größere Projekte realisieren willst ist eine schöne Code - Architektur unverzichtbar sonst blickst du irgendwann garnicht mehr durch.

    Das is auch nen riesen Thema welches in keiner Programmiersprache verzichtbar ist. In normalen Sprachen gibts zb Design -Pattern welche mehr oder weniger vorschreiben, wie zb eine GUI aufgebaut sein soll (Model View Controller)

  • Ah ok ich verstehe! Viele Dank!

    da ich aber vorerst 4 festgelegte Suchwörter hab, bleib ich bei der Case Lösung, sollten es mehr werden hab ich ja jetzt schon die Lösung parat ;)

    MfG Albeck