Programm zum durchsuchen von .inf Datein

  • Hallo Leute,
    ich wollte in letzter Zeit ein Programm schreiben, mit dem ich eine .ini bzw. eine .inf Datei nach einem Wort zu durchsuchen und danach die Zeile auszugeben, die 2 Zeilen darunter liegt. Das Wort, wonach die Datei durchsucht werden soll, soll man vorher durch einen Input-Eingabefeld festlegen.
    Bei meinem Code funktioniert das Fenster, aber wenn man den Button drckt, passiert nicht. Da ich mich erst 2 Tage mit dem Programm auseinander setze, bitte ich um eure Hilfe.

    Danke im vorraus :)

    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPIFiles.au3>


    $Form1 = GUICreate("Nummer suchen", 288, 130, 192, 124)
    $Name = GUICtrlCreateLabel("Name", 16, 16, 48, 23)
    GUICtrlSetFont(-1, 12, 800, 0, "Arial")
    $Input = GUICtrlCreateInput("", 16, 40, 249, 28)
    GUICtrlSetFont(-1, 12, 800, 0, "Arial Narrow")
    $Button1 = GUICtrlCreateButton("Suchen", 16, 72, 81, 33)
    GUICtrlSetFont(-1, 12, 800, 2, "Arial Narrow")
    GUISetState(@SW_SHOW)


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit


    EndSwitch
    WEnd


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1


    $datei = IniRead("C:\Users\Johannes\Desktop\caller.inf", "section2", "key", "NotFound")
    $eingabe = $Input


    $count = _FileReadLines($datei)


    For $i = 1 to $count
    $line = FileReadLine($datei, $i)


    If StringInStr($line, $Input) Then
    $z = 2
    $b = & i + $z


    $line = FileReadLine($datei, $b)
    MsgBox(0, "Nummer gefunden!" & $Input & @CRLF & "" & $line)
    EndIf
    Next


    EndSwitch
    WEnd

    • Offizieller Beitrag

    Außerdem:
    Die erste While...WEnd-Schleife ist überflüssig.
    Eine Datei zeilenweise einzulesen (noch dazu ohne ein Handle zu benutzen) ist sehr langsam. _FileReadToArray und anschließend das Array zu durchsuchen ist erheblich schneller.


    Zitat

    $b = & i + $z

    ist von der Syntax her falsch. Mal abgesehen davon, dass man das nicht extra einer/zwei Variablen zuweisen muss = FileReadLine($datei, $i + 2) würde auch gehen, aber die Schleife darf dann auch nicht bis zum Ende der Zeilen durchlaufen. Aber wie gesagt: _FileReadToArray.
    Insgesamt fehlt auch die Fehlerbehandlung. Was ist, wenn die Datei nicht existiert?

  • Eine Datei zeilenweise einzulesen (noch dazu ohne ein Handle zu benutzen) ist sehr langsam. _FileReadToArray und anschließend das Array zu durchsuchen ist erheblich schneller.

    Ohne Handle mit Angabe der Zeilennummer ist FileReadLine tatsächlich langsam aber _FileReadToArray (sicher das du die mit Unterstrich meinst?) muss nicht auf jeden Fall die schnellere Lösung sein.
    Besonders hier nicht, da ja nicht die Datei bis zum Ende durchgesucht werden muss.

    @hajoh25
    Mal hier ein Grundaufbau mit (korrekter Verwendung von) FileReadLine - allerdings ohne GUI:

    • Offizieller Beitrag

    Es gibt auch die Option mit regulären Ausdrücken zu arbeiten. Bei großen Dateien kann das durchaus schneller gehen. Ich habe hier mal eine Bsp-Funktion erstellt, die für mehrfache Suchen konzipiert ist, den Text aber nur einmal lesen muss.


    "test.txt"

    Code
    irgendwas
    nochwas
    was-anderes
    suchwort
    folgezeile_1
    folgezeile_2
    suche_2
    usw
    wieder-folgezeile_2

    EDIT: @Bernd oder @Gun-Food
    Jungs, falls jemand zufällig hier liest.
    BITTE bringt den Syntaxhighlighter in Ordnung - das ist doch eine Katastrophe.

  • $eingabe=$input ist falsch. richtig wäre $eingabe=guictrlread($input). Ansonsten ließt du den handle des controls ein (oder die nummer). und code bitte in code tags ;), danke :)

    Vielen Dank Kanashius, hat mir sehr geholfen und dieser Teil funktioniert jetzt super :)

  • Außerdem:
    Die erste While...WEnd-Schleife ist überflüssig.
    Eine Datei zeilenweise einzulesen (noch dazu ohne ein Handle zu benutzen) ist sehr langsam. _FileReadToArray und anschließend das Array zu durchsuchen ist erheblich schneller.


    ist von der Syntax her falsch. Mal abgesehen davon, dass man das nicht extra einer/zwei Variablen zuweisen muss = FileReadLine($datei, $i + 2) würde auch gehen, aber die Schleife darf dann auch nicht bis zum Ende der Zeilen durchlaufen. Aber wie gesagt: _FileReadToArray.Insgesamt fehlt auch die Fehlerbehandlung. Was ist, wenn die Datei nicht existiert?

    Danke, den Syntaxfehler habe ich erst gar nicht gesehen, habe ich jetzt aber verbessert und die erste Schleife auch entfernt :)

  • Ohne Handle mit Angabe der Zeilennummer ist FileReadLine tatsächlich langsam aber _FileReadToArray (sicher das du die mit Unterstrich meinst?) muss nicht auf jeden Fall die schnellere Lösung sein.Besonders hier nicht, da ja nicht die Datei bis zum Ende durchgesucht werden muss.

    @hajoh25
    Mal hier ein Grundaufbau mit (korrekter Verwendung von) FileReadLine - allerdings ohne GUI:

    Danke, dein Grundaufbau hat mir sehr geholfen, mit dem Funktioniert es viel besser. Jedoch wird mir die zweite Zeile in der MsgBox angezeigt, allerdings wollte ich 2 Zeilen UNTER dem Suchbegriff und nicht die zweite Zeile. Wenn du mir ein weiteres mal helfen könntest, wäre ich dir serh dankbar :)

  • Also der jezige Code sieht so aus:

  • Du liest den Suchbegriff in die Variable $eingabe.
    Im StringInStr wird diese aber nicht verwendet sondern $input.
    Es wird also gar nicht mit deinem Suchbegriff gesucht.

    Geändert:

  • Um die gefundene Line aus der Datei in Deiner GUI anzeigen zu lassen, musst Du noch ein zusätzlliches GUICtrlCreateLabel an die Stelle setzen, wo das Ergebnis angezeigt werden soll.

    Bei der Suchfunktion kannst Du dann das Ergebnis mit GUICtrlSetData in das extra dafür erstellte Label schreiben.