In ext. Datei nach Wörtern suchen

  • Moin,

    ich möchte in einer bestimmten Textdatei ein bestimmtes Wort suchen.
    Das Wort das gesucht wird, wird aber nicht eingegeben, sondern stammt
    aus einer anderen Textdatei.

    Quasi soll der Inhalt der einen mit dem Inhalt der anderen Datei verglichen
    werden.

    Dazu finde ich in der Hilfedatei nun überhaupt nichts.

    Wie kann ich denn Rückgabewerte zurückgeben und darauffolgend
    eine Aktion ausführen ähnlich wie errorlevel bei batch?

    5 Mal editiert, zuletzt von Scritch (1. Oktober 2010 um 07:51)

  • Danke für die fixe Antwort. Jedoch ist das von dir gepostete doch etwas komplex.
    Es ist ein Wort pro Zeile was in dem anderen Dokument gefunden werden soll.

    Ein ext. Programm kommt auch eher nicht in Frage.
    Batch wäre noch okay, aber irgendwie ist das so wie ich es haben möchte nicht realisierbar.

    • Offizieller Beitrag

    Es ist ein Wort pro Zeile was in dem anderen Dokument gefunden werden soll.


    Dann werd doch bitte mal ganz konkret:
    - Hast du eine Liste mit "Suchwörtern" in einer Datei (1 Begriff/Zeile)?
    - In der zu überprüfenden Datei: Kommt der jeweilige Suchbegriff nur einmal od. evtl. öfter vor?
    - Was erwartest du für eine "Antwort" von der Funktion?
    Am Besten, du stellst mal entsprechende Musterdaten rein, vorher - nachher.

  • Sorry dass ich mich nicht klar ausgedrückt habe.
    Also: Ich habe eine Datei wo laufende Dienste (vergleichen.txt) aufgeführt sind,
    die ausgelesen wurden sind. Jeder Dienst kommt hier nur einmal vor.
    Die Datei mir der verglichen wird, ist die Referenzdatei (referenz.txt). Hier stehen Dienste
    drinnen, die laufen sollten. in jeder Datei steht blos 1 Wort/Zeile.
    Außerdem sollen Dienste, die den Status deaktiviert haben und ebenfals
    in einer separaten Datei (tabu.txt) liegen, nicht berücksichtigt, d. h. nicht gesucht werden.

    Also:
    Optimal ist es so, dass das erste Wort aus "vergleichen" genommen wird, in eine Variable
    gepackt wird. Dann wird in "tabu" gesucht, ob dieses Wort dort existiert. Ist das der Fall,
    wird die Variable gelöscht und das zweiter Wort aus "vergleichen" in eine Variable geschrieben.
    Hier wieder der Vergleich mit "tabu". Angenommen das Wort ist hier in "tabu" jetzt nicht vorhanden,
    wird das Wort in der Variablen jetzt in Referen gesucht. Ist das Wort dort vorhanden, wird die Variable
    wieder gelöscht. Ist das Wort aber nicht vorhanden, so wird dieses Wort in eine Datei geschrieben.
    Alle weiteren Wörter die in der "referenz" und "vergleichen" nicht vorkommen sollen darunter aufgeführt
    werden.

    So ist mein Plan :)

    • Offizieller Beitrag

    Versuchs mal selber, hier das Gerüst:
    - Mit _FileReadToArray alle 3 Dateien in jeweils ein Array einlesen
    - Array "Vergleichen" durchlaufen
    - suche aktuellen Eintrag in "Tabu" (vorhanden, weiter mit nächstem Eintrag)
    - nicht vorhanden: suche Eintrag in "Referenz" (vorhanden, weiter mit nächstem Eintrag)
    - nicht vorhanden: Eintrag in Ausgabestring schreiben ($out = $out & $Eintrag[$i] & ',')

    • Offizieller Beitrag

    Ich habs mal schnell zusammengebastelt:

    [autoit]

    Local $fileTabu = 'Pfad_zur_Datei'
    Local $fileReferenz = 'Pfad_zur_Datei'
    Local $fileVergleich = 'Pfad_zur_Datei'

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

    Local $aTabu, $aReferenz, $aVergleich
    _FileReadToArray($fileTabu, $aTabu)
    _FileReadToArray($fileReferenz, $aReferenz)
    _FileReadToArray($fileVergleich, $aVergleich)

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

    Local $sOut = ''

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

    For $i = 1 To UBound($aVergleich) -1
    _ArraySearch($aTabu, $aVergleich[$i], 1)
    If @error Then ; Eintrag nicht in Tabu enthalten
    _ArraySearch($aReferenz, $aVergleich[$i], 1)
    If @error Then ; Eintrag nicht in Referenz enthalten
    $sOut &= $aVergleich[$i] & @CRLF
    EndIf
    EndIf
    Next

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

    ; Ich weiß nicht genau in welche Datei du das Ergebnis schreiben willst.
    ; So kannst du an eine bestehende anhängen oder auch eine neue Datei schreiben:
    Local $fh = FileOpen('Pfad_zur_Datei', 1)
    FileWrite($fh, $sOut)
    FileClose($fh)

    [/autoit]
  • Super, vielen Dank. Wäre nicht nötig gewesen, aber trotzdem :)
    Ich war wenigstens mit meinem Ansatz schon auf dem richtign Weg.
    Immerhin :)

    Habs soweit auch verstanden, außer ein paar Kleinigkeiten.
    Warum deklarierst du hier eine Variable?

    Code
    Local $sOut = ''


    Wofür steht UBound?

    Code
    For $i = 1 To UBound($aVergleich) -1


    Warum 1 und -1? Eine Zeile pro Durchlauf wird "bearbeitet?

    Die Zeile verstehe ich gar nicht:

    Code
    $sOut &= $aVergleich[$i] & @CRLF


    Wäre klasse, wenn du dazu nochmal was schreiben könntest,
    damit ich das das nächste Mal auch anwenden kann.

    Danke nochmal!

    • Offizieller Beitrag

    Local $sOut = ''

    Es wird eine leere Variable zum Aufnehmen der später in die Datei zu schreibenden Einträge erstellt.

    For $i = 1 To UBound($aVergleich) -1

    Start bei Index=1 (schau in die Hilfe, an Index=0 steht die Anzahl der gelesenen Zeilen), bis zum letzten Eintrag mit Index= UBound (Anzahl Einträge im Array) -1, da Index mit 0 beginnt ist letzter Wert 1 kleiner als Anzahl.

    $sOut &= $aVergleich[$i] & @CRLF

    Hier wird der Variablen, deren Inhalt in die Datei geschrieben werden soll der jeweilige Eintrag (nicht in Tabu und nicht in Referenz) hinzugefügt + Zeilenumbruch. Somit braucht man die Variable später nur direkt in die Datei schreiben. Jede Zeile enthält dann einen Wert.

  • So, ich melde mich nochmal zurück. Betreff: gleiches Problem.
    Habe mein Script jetzt soweit fertig und habe das von dir auch
    erfolgreich eingebaut.

    Allerdings wird nicht das Suchergebnis in die Datei geschrieben, sondern
    irgendwie alle eingelesenen Arrays mehrmals untereinander,
    sodass ich mehr als 1.800 Zeilen Wörter habe (normal sollten es
    unter 10 sein)
    Jedes Array welches ich aus einer ext. Datei einlese (insg. 3)
    ist 109 Zeilen lang...

    Wie mag das kommen?

    Edit: Oberes Problem hat sich erledigt. War ein Fehler meinerseits.
    Was anderes: Werden nur Buchstaben in _ArraySearch gesucht?
    Sonderzeichen wie "." und "-" überhaupt nicht?

    Edit2: Auch selber schon gelöst - Sonderzeichen werden nicht beachtet.

    2 Mal editiert, zuletzt von Scritch (27. September 2010 um 14:11)

    • Offizieller Beitrag

    In dieser Schleife werden die Einträge ermittelt, die weder in Tabu, noch in Referenz enthalten sind und in die Variable $sOut geschrieben, getrennt durch @CRLF.
    Der Inhalt von $sOut ist dann in eine Datei zu schreiben. Das von dir geschilderte Problem kann ich anhand meines Bsp.-Codes nicht nachvollziehen.

    Spoiler anzeigen
    [autoit]

    For $i = 1 To UBound($aVergleich) -1
    _ArraySearch($aTabu, $aVergleich[$i], 1)
    If @error Then ; Eintrag nicht in Tabu enthalten
    _ArraySearch($aReferenz, $aVergleich[$i], 1)
    If @error Then ; Eintrag nicht in Referenz enthalten
    $sOut &= $aVergleich[$i] & @CRLF
    EndIf
    EndIf
    Next

    [/autoit]
  • Hat alles bestens geklappt, danke.

    Allerdings sitze ich gerade wieder vor einem Problem. Musste ich micht gestern noch mit 1D-Arrays rumschlagen, sind heute
    die 2D-Arrays an der Reihe. Mein Problem ist, dass ich nicht weiß, wie ich Textdateien in ein Array 2D Array einlesen kann.

    Meine gelesen zu haben, dass man die Textdateien jeweils in ein Array packt und dann diese Arrays in das 2D-Array.
    Oder ist das Mumpitz? Ein weiteres Problem: Ich kenne zwar die Spaltenzahl (3) aber nicht die Zeilenzahl.

    Dein Tut zu Arrays habe ich gelesen, zumindest den Teil für 2D-Arrays, BugFix. Allerdings weiß ich es bei meinem Problem nicht anzuwenden :(

  • Hallo scritch,

    setze bitte diesen Thread auf gelöst, denn genau zu deinem neuem Problem hast du gleich 2 Threads aufgemacht, 1 davon habe ich aktiviert und auch den Lösungsweg mit einem Beispiel gepostet.

    Zwei Threads erstellen und auch noch hier das ist schon sehr unverschämt und sollte mE eine Verwarnung nach sich ziehen,

    mfg autoBert

  • Naja, wenn mir die Seite einen Fehler ausgibt, dass ich nicht berechtigt sei (den genauen Wortlaut habe ich gerade nicht im Kopf)
    einen Thread zu eröffnen (Und der Thread auch nicht in der Übersicht erschien -> Daher wohl der Doppelthread), habe ich keine
    andere Möglichkeit gesehen in diesem Thread zu posten. Da steckten keine bösen Absichten dahinter ;)

  • Naja, wenn mir die Seite einen Fehler ausgibt, dass ich nicht berechtigt sei

    Bitte schon bisschen Lesen was da drinsteht^^
    Das is nämlich keine Fehlermeldung gewesen sondern eine Benachrichtigung.
    Müsste in etwa sowas stehen wie: Der Thread muss erst von einem Administrator freigeschalten werden
    (das ist bei neuen Usern so weil viele sich angemeldet haben um irgendwelche Werbung zu posten oder sich einfach nicht an die Forenregeln hielten)