Bestimmte Textstelle suchen, auslesen und zeilen anzeigen.

  • Hallo

    Also ich hab so ein Programm erstellt, welches automatisch bestimmte Dateien erstellt. (die braucht man für so eine Lüftersteuerung des Programmes NHC, aber das ist jetzt nicht wichtig)

    Also es soll eine Datei ausgelesen werden. Zum Beispiel diese:

    Code
    Hallo
    testestestest
    Zeile 3
    [...]
    "Textstelle", die gesucht werden soll, Zeile ist nicht bekannt. Die "Textstelle" ist aber immer gleich.
    Zeile xx
    zeile xx
    zeile xx
    BENÖTIGTER Text befindet sich 3 Zeilen unter der "Textstelle"

    Es müsste also die "Textstelle" gesucht werden und dann 3 Zeilen unter der Textstelle der wert ausgelesen werden.

    Wenn ich diesen benötigten Text auslesen kann, ist es SUPER! :)

    _______
    Eine Sichtbare Lösung wäre so:
    Ich öffne die Datei mit dem Editor und suche das Wort ("textstelle"). Ich sehe, die Textstelle befindet sich in Zeile 39. (ändert sich aber von datei zu datei)
    Dann drücke ich STRG+G (Gehe zu) und tippe Zeile 42 ein (39+3=42^^). Und siehe da, ich hab meinen benötigten Text gefunden.
    Ich könnte filereadline oder so verwenden, wenn ich die Line kennen würde. aber ich kenne sie nicht.
    _____

    Ich hätte es gerne auf einem unsichtbaren weg. Ist es überhaupt möglich eine Datei unsichtbar nach einem wort zu durchsuchen, die zeilenangabe auslesen und dann die ausgelesene Zeilenangabe +3 = Gesuchte Zeile+wert.

    Das ist schwer zu erklären, was ich vorhab, aber ich hoffe ich konnte es einigermaßen gut beschreiben. Falls es verständnisfragen gibt, einfach fragen ;)

    • Offizieller Beitrag

    Hallo,

    probiers mal damit, $szTextstelle durch die definierte Textstelle ersetzen und $szDateiname zur den Namen der Datei ersetzen:


    [autoit]

    $szTextstelle = "Textstelle"
    $szDateiname = "Test.txt"

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

    $szText = FileRead($szDateiname)

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

    $aszMatch = StringRegExp($szText, "(?i).*" & $szTextstelle & ".*\r\n.*\r\n.*\r\n.*\r\n(.*)", 2)

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

    MsgBox(0, "", $aszMatch[1])

    [/autoit]
    • Offizieller Beitrag

    Hi,

    sieht klasse aus bernd!

    Spoiler anzeigen
    [autoit]

    Global $szTextstelle = '3', $szDateiname = '..\1.txt', $szText = FileRead($szDateiname)
    Global $aszMatch = StringRegExp($szText, '(?i).*' & $szTextstelle & '(.*\r\n){4}.*', 2)
    If IsArray($aszMatch) Then
    MsgBox(0, '', $aszMatch[1])
    Else
    ConsoleWrite("No match" & @CRLF)
    EndIf

    [/autoit]

    Mega

  • hm.. danke erstmal für die antworten, aber so ganz versteh ich es noch nicht.

    Hier ist mal ein Ausschnitt der Datei:

    Eigentlich muss nur nach Scope (\_tz) gesucht werden und die Zeile angezeigt werden, wo sich Scope (\_TZ) befindet.

  • Spoiler anzeigen
    [autoit]

    #include <File.au3>
    $file = "blubb.txt"
    $wort = "Scope (\_tz)"
    $openfile = FileOpen($file, 0)
    For $i = 1 To _FileCountLines($file)
    $readline = FileReadLine($openfile, $i)
    If StringInStr($readline, $wort) Then
    MsgBox(0, "", "Die Zeile, in der " & $wort & " steht, lautet: " & $i)
    Exit
    EndIf
    Next
    MsgBox(0, "", $wort & " ist leider nicht in der Datei vorhanden.")

    [/autoit]
  • Darf ich hier meine Frage gleich mit anhängen, da sie auch so was ähnliches beinhaltet?

    Ich versuchs einfach mal...

    Ich versuche einen bestimmten zufälligen Code aus einem Programm auszulesen und diesen ggf. in ein weiteres Programm schreiben zu können... hier nunmal die Grundidee:

    run ( "Gruene_Wiese.exe" )
    WinWait ( "Grüne Wiese v1.0" )
    controlclick( "Grüne Wiese v1.0", "Passwort", 1008 )
    WinGetText ( "Passwort" , 1007 )

    run ( "Notepad" )
    WinWait ( "Neues Textdokument.txt - Editor" )
    Send ( "{INSERT}" , 15 )

    Ob das ganze aber so funktioniert weiß ich nicht. Da ich erst vor nen paar Tagen damit AutoIt angefangen habe. Nun ist mir aber aufgefallen, das ich WinGetText evtl. gar nicht brauche. Da das Programm das Passwort auch in die Zwischenablage schreibt. Wenn Nodepad aber geöffnet wird, fürgt das Script nicht das Password sondern, bloß {INSERT} in das Textdokument. Wenn die funktioniert könnte ich versuchen das ganze in eine Loop Funktion zu stecken.

    Also Knopf Drücken, Code auslesen und woanders einfügen. Mehr bräuchte schon gar nicht geloopt werden. Woran liegts das {INSERT} nicht funktioniert?

  • JA :D ES GEHT :) :thumbup: :thumbup:

    VIELEN DANK !!! !!! !!!
    Dieses Forum ist echt SUPER (und erst recht die Leute die so gut helfen :) )!

    EDIT: Da die Datei meistens bis zu 8000 Zeilen hat, dauert es etwas, bis sie Fertig durchsucht ist. (kommt auf Prozessorleistung an, bei mir ca. 40 Sekunden - Intel Pentium M 1.73 GHz). Könnte man wohl eine Progressbar für den Suchfortschritt "machen" ?

    Wenn es nicht geht, ist nicht schlimm. Dann schreib ich ne MsgBox mit "Please wait, while text is analyzed", welche automatisch verschwindet, wenn er fertig mit durchsuchen ist.

    Einmal editiert, zuletzt von Henry (23. April 2008 um 17:28)


  • Hallo Also ich würde wingettext als String festlegen

    Spoiler anzeigen

    run ( "Gruene_Wiese.exe" )
    WinWait ( "Grüne Wiese v1.0" )
    controlclick( "Grüne Wiese v1.0", "Passwort", 1008 )


    $passwort = WinGetText ( "Passwort" , 1007 )

    run ( "Notepad" )
    WinWait ( "Neues Textdokument.txt - Editor" )
    Send ( $passwort & "", 15 )

    Insert funktioniert nicht da es ja den Tastendruck der Einfügen Taste auslöst

    Wenn du mit Tastenfunktion einfügen möchtest kann man es mit {STRG}+{V} lösen

    also

    Send ("{CTRLDOWN}v{CTRLUP}")

    Grüße OUTSID3R

    • Offizieller Beitrag

    Hi,

    das sollte schneller als 40 Sek sein.

    [autoit]

    Global $szTextstelle = '\(\\_TZ\)', $szDateiname = '..\1.txt', $szText = FileRead($szDateiname)
    Global $aszMatch = StringRegExp($szText, '(?i).*' & $szTextstelle & '(.*\r\n){4}.*', 2)
    If IsArray($aszMatch) Then
    MsgBox(0, '', $aszMatch[1])
    Else
    ConsoleWrite("No match" & @CRLF)
    EndIf

    [/autoit]

    Mega

  • Xenobiologist :
    ja, das geht schneller, gerade hab ich's auch damit hinbekommen.
    Ich guck noch, welche Funktion ich eher gebrauchen kann.

    Jetzt ließt er ja in deinem Beispiel die 4. Zeile unter (_TZ) aus. Kann man es auch machen, dass er in der 4. Zeile unter (_TZ) etwas schreiben soll?
    (also das was vorher da in der Zeile stand sollte überschrieben werden.)

    EDIT: was genau bedeutet Global vor den variablen?

  • überschreiben würd ich mit _FileWriteToLine($file, $line, $text, 1) machen.
    Natürlich $file $line und $text noch anpassen, habe es nur als Beispiel benutzt. 1 Steht für "überschreiben", ohne die würde es nur eine Zeile dazwischen fügen. #include <File.au3> noch, fals du noch nicht hast.

  • Global heißt das die Variable im ganzen Script verfügbat sein soll braucht man hauptsächlich in Funktionen und weils schöner aussieht ;)
    Daneben gibt es noch Dim, Local und Const:
    Dim ist einfach um eine Variablendefinition zu Kennzeichnen und hat sonst keinen besonderen Effekt, Local um eine Variable nur in einer Funktion verfügbar zu machen und Const um eine Konstante zu erzeugen, die sich später nicht mehr ändern kann.
    Hinweis: Von Dim wird wegen abgeraten, da dort der "Wirkungsbereich"(-> engl. Scope) nicht gesichert ist.

    PS: Das steht auch alles in der Hilfe X( aber weil du neu bist und es mir am Anfang auch so ergangen ist, hab ichs noch mal erklärt.
    PPS: Falls trotz geöffneter Hilfe doch was falsch ist, bitte berichtigen.

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Ich hab zwar die vorher geposteten Codes getestet und rumprobiert, aber ich hab es noch nicht geschafft, was ich erreichen wollte.

    Aus der angehängten Textdatei möchte ich folgendes auslesen (vielleicht in ein Array, je nachdem was günstiger wäre):
    1. File size
    2. Duration
    3. Format <- das unter Video
    4. Width
    5. Height

    Muss ich mit StringRegExp arbeiten?