Excel-, Word-, CSV-Dateien nach einem Suchbegriff durchsuchen

  • Hi Leute,

    ich habe häufiger die Anforderung alle Excel-, CSV-, oder Word-Dateien in Verzeichnissen nach einem Suchbegriff zu durchsuchen - meist ein eindeutiger Bezeichner für einen Datensatz. Ich benutze dafür ein wunderbares Tool: grepWin (https://sourceforge.net/projects/grepwin/). Obwohl es wunderbar funktioniert, wollte ich die Suchfunktion nachbauen, um mir noch etwas zu automatisieren und im Grunde ist das Tool auch oversized für meine Zwecke..

    CSV-Dateien stellen ja kein Problem dar; ich habe sie nur erwähnt, weil ich auch sie durchsuche.. Um einen Suchbegriff mit grepWin zu finden, muss man einen Haken bei "Include Binary Files" setzen und schon werden auch Excel-Dateien mit einem Treffer gelistet.

    Da habe ich mir gedacht, ich könnte einfach, ohne Beachtung des Dateityps, alle Dateien als Binary öffnen und den Suchbegriff als Binary-String darin suchen. Aber so plump klappt das bei mir nicht. Ich hoffe ihr könnt mir da weiter helfen.

    Unten habe ich mal einen Ordner mit einigen Testfiles und meinem Skript angehängt (Die Inhalte sind immer 1234 oder Das ist ein Test). Wahrscheinlich könnt mir aber schon anhand des Codes sagen, wo meine Fehler liegen.

    Spoiler anzeigen
  • Ich würde einfach um zu testen mal hinter dein Local $sString = GUICtrlRead($idFile) ein ConsoleWrite($sString & @CRLF) machen und dann auch noch mal hinter Local $bString = StringToBinary($sString) um zu sehen ob da bei der Kovertierung eventuell was falsch läuft.

    LG

    LG

    Philip

  • Das funktioniert schon. Allerdings wohl nicht richtig.

    Mein Verdacht war ja das Öffnen mit FileOpen als Binary. Ich dachte, da liegt ein Fehler. Ich öffne alle Dateien im Binärmodus und wandele den String um. Bei der Suche erhalte ich dann nur in den csv-Dateien Treffer (allerdings wäre das Konvertieren hier ja eigentlich nicht nötig). Bei den Dateien, die schon nicht von vornherein einfach auszulesen sind, klappt es aber auch mit dem Binary-String nicht.

    Grüße autoiter

  • Ich möchte einfach einen Suchbegriff in verschiedenen Dateien in einem Ordner suchen und mir die Datei/en auflisten lassen, in der/denen der Suchbegriff gefunden wurde. Fertig.
    Schau dir noch einmal meinen ersten Beitrag an ;)

    Grüße autoiter

  • Ich hab jetzt einfach mal zu Spaß deine Funktion etwas angepasst

    Spoiler anzeigen

    Wenn ich das ausführe und mir das Array ansehe, sehe ich nur Hieroglyphen. Dabei spielt es keine Rolle wie die Datei geöffnet ist.
    Eventuell musst du einen anderen Weg gehen. Hast du schon mal überlegt die Word und Excel Funktionen von AutoIt da zuzunehmen? Oder ist auf dem Client kein Office installiert?

    LG

    LG

    Philip

  • Danke für eure Antworten :)

    @Kanashius
    Das kann natürlich sein. :(

    @n00b-it
    Stimmt. Wenn du das aber nicht mit dem Array-Kram machst, sondern einfach das FileRead ($sFileRead) in die Konsole oder eine MessageBox schreiben lässt, siehst du keine Hieroglyphen, sondern eigentlich eine Ausgabe, die aussieht, als könnte das richtig sein ^^ . Naja. Könnte.

    Ich habe auch daran gedacht, die Word- und Excel-Funktionen zu nehmen - Office ist installiert. Allerdings hatte ich eher im Sinn, das vielleicht auf die zuvor eingegrenzten Trefferdateien zu machen, falls ich doch mal direkt zum Eintrag springen, oder bei Excel den ganzen Datensatz auslesen möchte. Für alle Dateien schien mir das zu langwierig, da ich immer so zwischen 500 und 1000 Dateien durchsuche..


    Ich werde es mal ausprobieren. Mal sehen, ob das brauchbar ist. Im Zweifel automatisiere ich eben greWin für diesen Schritt. Das Tool lässt sich auch per Konsole bedienen.

    Grüße autoiter

  • Hallo @bazii,

    danke für deine Tipps. Da auch xls- und doc-Dateien dabei sind, schien es mir jetzt doch besser einfach die UDFs zu nehmen plus normales Lesen für csv.

    Da habe ich eine Frage, die fast OT ist.. Ich habe Probleme mit der Excel UDF.
    Das folgende funktioniert:

    AutoIt
    Local $oWorkbook = _Excel_BookOpen(_Excel_Open(False), $sPath, True)
    Local $aData = _Excel_RangeRead($oWorkbook)

    Das Array kann ich dann durchsuchen. Also eigentlich alles gut.

    Allerdings dachte ich, es geht vllt. etwas schneller, wenn ich _Excel_RangeFind benutze.

    AutoIt
    Local $oWorkbook = _Excel_BookOpen(_Excel_Open(False), $sPath, True)
    Local $aResult = _Excel_RangeFind($oWorkbook, "5678")

    Allerdings stürzt dann das Skript in der UDF ab. Die Konsole sagt folgendes:


    AutoIt
    "C:\Program Files (x86)\AutoIt3\Include\Excel.au3" (656) : ==> The requested action with this object has failed.:
    $aResult[$iIndex][1] = $oMatch.Name.Name
    $aResult[$iIndex][1] = $oMatch^ ERROR


    Kann mir jemand sagen, wo das Problem liegt?

    Grüße autoiter

  • Guten Morgen Leute,

    Gestern habe ich mal meine Suche gebastelt, die ich heute an vielen Dateien testen möchte. Es klappt nun auch mit _Excel_RangeFind - in der korrigierten Fassung, auf die autoBert verlinkt hat. Allerdings stört mich daran noch eine Sache. Ich weiß nicht, ob das auch ein Bug ist, oder einfach ein für mich eher unschönes Verhalten, das ich in anderen Zusammenhängen durch Prüfungen vermeide.

    Und zwar gibt _Excel_RangeFind immer ein Array zurück - auch wenn kein Treffer gefunden wurde. In diesem Fall kommt eben ein völlig leeres Array (hier $aResult). Ein Blick in die Hilfe, sagt mir zwar nicht, dass in dem Fall ein @error-Wert gesetzt wird, aber als Success hätte ich das auch nicht erwartet.

    Leeres Array.png Hier könntet ihr mir wieder etwas Grundlagen beibringen. Dafür wäre ich sehr verbunden. Wie prüft man das am Besten. Eine Prüfung ob $aResult[0][0] == "" ist, führt hier zum Absturz. Ich habe mich daher für Ubound($aResult) > 0 entschieden. Davon würde ich aber sehr gerne wieder weg.


    Hier ein Bsp. wenn im Skript-Ordner eine excel1.xlsx mit einem beliebigen Inhalt liegt, der keinen Treffer mit dem Suchbegriff ergibt.

    Grüße autoiter

  • Oh, die Erklärung von water habe ich gar nicht gelesen. Steht wahrscheinlich im Wiki, oder?

    Dann wird bei jeder xls oder xlsx ein Ubound nötig.. Wahrscheinlich fahre ich dann doch mit _Excel_RangeRead und _Arraysearch besser. Werde ich mal testen. Danke dir @autoBert.

    AutoIt
    Local $aData = _Excel_RangeRead($oWorkbook)
    $iSearch = _ArraySearch($aData, $sSearchString, 0, 0, 0, 1)
    If $iSearch <> - 1 Then ...

    Grüße autoiter

  • Hey Leute,

    falls es mal jemanden interessiert, hier meine Erfahrungen.
    Die Experten werden es gewusst haben. Ich sehe nun ein, dass AutoIt nicht das Werkzeug der Wahl für massenhaftes Durchsuchen von Dateien ist (wenigstens nicht so, wie ich das mache)..

    Überraschenderweise muss ich schon sagen, dass die oben geschilderte Kombination von _Excel_RangeFind und Ubound bei jeder Suche doch deutlich schneller ist, als mein Favorit _Excel_RangeRead und _ArraySearch (- etwa doppelt so schnell!!).


    Getestet habe ich an einem Ordner mit 450 Excel-Dateien.
    Bei meinem Skript habe ich nun voll auf die UDFs gesetzt.
    (Das zeitraubende ArrayAdd wird nur im Erfolgsfall ausgeführt. Bei meinem Test nur einmal).


    Ergebnis:


    - Mein AutoIt-Skript: Zwischen 80 und 85 Sekunden (mit direktem Aufruf der Suche, ohne GUI-Abfrage).


    - grepWin: 15 Sekunden

    Da ist es sicher besser grepWin per Konsole zu starten und die Ergebnisse aus der GUI zu lesen, um damit weiter zu arbeiten.

    Hier die Suche soweit ich sie hatte (Wenn ihr da Schnitzer seht, wäre ich euch für Hinweise dankbar.:(

    Spoiler anzeigen


    Wahrscheinlich werde ich das Skript in einer Stichwortsuche für Arbeitsanleitungen verwenden. Da könnte das noch nützlich werden. Für größere Suchen, aber eher nicht..

    Falls du dich hierhin verirrt hast und eine Lösung auf Binärebene hast, melde dich ruhig auch, wenn der Thread ein, zwei Jahre alt ist. Wahrscheinlich wird es mich wirklich noch interessieren :D

    Grüße autoiter

    3 Mal editiert, zuletzt von autoiter (12. Oktober 2016 um 21:27)

  • Hi Leute,
    auf eine email-Frage von mir, hat der grepWin-Programmierer mir geantwortet, dass dieses Programm tatsächlich ohne Beachtung der Datei arbeitet, wenn man die Suche in Binär-Dateien auswählt. Scheinbar geht das also doch?!?

    Wahrscheinlich ist doch ein Fehler in meinem Skript in Post 1. Erkennt da jemand etwas? Werden die Dateien falsch geöffnet, oder der String falsch umgewandelt?


    (Ungeliebter Push eines eigenen Themas.. Ist aber als einmalige Sache gedacht und kam nur, weil ich diese interessante Info bekommen habe).

    Grüße autoiter