Schlagwortsuche in Textdateien

  • Hi Leute,

    Hier habe ich zur Ansicht und Basteln ein Schlagwortsuche-Programm. Es eignet sich am besten, wenn damit häufiger bestimmte Verzeichnisse durchsucht werden, da bei der ersten Suche ein SQLite-Datenbank angelegt wird und bei weiteren Suchen nur neue oder geänderte Dateien eingelesen werden.

    Office muss nicht unbedingt installiert sein. Ich habe ich intensiv bei anderen bedient, die diese Dateien mit String-Operationen auslesen. Im Quelltext findet ihr neben dem Funktionsstart die URL zum ursprünglichen Thread. Nur bei die xls Auslesen mit ADODB habe ich mir mehr Mühe geben müssen. Für PDF wird neben einer UDF noch eine externe Exe verwendet.

    Ich habe das Skript kommentiert, damit man es etwas nachvollziehen kann. Zum Überblick noch grundsätzlich zum Aufbau:
    Am besten erst einmal die Ordner einklappen. Dann sieht man, dass die Funktionen thematisch blockweise angeordnet sind.

    - Zuerst kommen die Deklarationen und die verwendeten Fenster.
    - Dann die Schleife, in der die Controls überwacht werden.
    - Dann die zentrale Suche, die nach einem Klick auf suchen aufgerufen wird (_SearchAndProgress)
    (Hier wird das Verzeichnis ausgelesen und je nach Dateityp die entsprechende Funktion aufgerufen, so die Datei nicht schon in der DB ist).
    - Dann kommen die _GetContent_XXX Funktionen. Diese Funktionen werden bei der Suche aufgerufen und wenn man im Hauptfenster
    eine Datei anklickt um sie anzuzeigen.
    (Hier werden nur die entsprechenden Funktionen aufgerufen und teilweise bei möglichen Fehlern doch die Excel oder Word UDF aufgerufen wenn möglich).
    - Dann kommen die Funktionen zum eigentlichen Auslesen der Dateitypen.
    - Danach kommen die beiden Funktionen, in denen die beiden GUIs für Tabellen und Texte vorbereitet werden.
    - Dann kommt der Block mit den GUI-Events
    (_WM_NOTIFY für die Klicks in die Listviews, _WM_SIZE für die Anpassung von best. Controls an die neue Größe _EndSize für die Reaktion auf beendetes Ändern der GUI-Größe und _WM_GETMINMAXINFO für das Sicherstellen bestimmter Mindestgrößen der einzelnen Fenster.)
    - Schließlich Verwaltungsfunktionen für Dateifilter, Includes, SQLite-Start usw.

    Im Verzeichnis findet sich das Skript "Textsuche.au3", ein Ordner mit den Includes und ein Ordner mit Beispieldateien (Einfache Vorlagen - sinnvoll testen kann man es wohl nur, wenn man selbst Ordner mit möglichst vielen Text- und Exceldateien hat.)
    (zuerst hieß das Skript "Schlagwortsuche.au3". Nun heißt es "Textsuche.au3")

    ____________________________________

    In der angehängten Version, der ich die Versionsnummer 2 gegeben habe, wurden die Filtern von Arrays auf Dictionaries geändert. Die tolle Anregung kam von @Zeitriss und ich möchte mich hier noch einmal dafür bedanken :)
    Der Geschwindigkeitsgewinn - vor allem bei wiederholten Suchen - ist enorm!
    Zum Vergleich habe ich auch die letzte Version mit Arrays in dem Paket, mit der ihr das testen könnt.
    Die Dictionaries werden vor allem in den Funktionen _SQLiteStartup, _FileList und _SearchAndProgress verwandt.

  • Hallo autoiter,
    Sehr gutes Programm und nützlich! Super Kommentiert ! Für Anfänger wie ich, sehr hilfreich danke!
    aber bei zweite Start kommt diese Fehler :

    Code
    "C:\Users\x\Desktop\Schlagwortsuche\Schlagwortsuche.au3" (612) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    _SQLite_Exec($hDB, "DELETE FROM FILES WHERE FULLPATH = '" & $aSQLFiles[$i][1] & "';")
    _SQLite_Exec($hDB, "DELETE FROM FILES WHERE FULLPATH = '" & ^ ERROR

    wenn ich die "Schlagwortsuche.db" lösche , dann geht es wieder. also nur für nächstes mal dann muss ich wieder löschen und so weiter.
    bitte um Hilfe. was mache ich nicht richtig? Autoit ver. 3.3.14.2 x86 , Win7 x64

    Danke. !
    Grüße Besarion

    Einmal editiert, zuletzt von Besarion (30. November 2016 um 13:52)

  • Hi @Besarion,

    Danke für den Hinweis. Wirklich blöd. Schau mal im Skript. Da steht ja, dass der Fehler in Zeile 612 auftritt.

    Zuvor suche ich im Array ob die Datei schon darin gespeichert ist. Im Erfolgsfall wird die Indexnummer in der Variable $iIndex gespeichert.
    Danach prüfe ich dann ob die Filetime der Datei mit der aus dem Array übereinstimmt. Wenn nicht soll die Datei aus der DB und dem Array entfernt werden. Allerdings benutze ich hier nicht den Index aus $iIndex sondern den aktuellen Wert von $i aus der For-Schleife.. :Face:
    Ersetze mal das $i in den beiden Zeilen (612, 613) durch $iIndex. Dann wird auch das Richtige gelöscht.


    Es gibt aber noch eine bekannte mögliche Absturzursache (ADO - XLS -> Array - Probleme). Ich werde das nochmal korrigiert hochladen.

    Grüße autoiter

  • Hallo autoiter

    Ich entschuldige wegen meine falsche "Hinweise" :Face: , das war meine schuld ! :Face: Deine Script Funktioniert Perfekt!!! ich habe nur bei der Zeile 625 einfach "au3" hinzugefugt

    Code
    Case $aPathSplit[$aPathSplit[0]] == "txt", "TXT", "au3"

    weil ich wollte etwas auch in "au3" Dateien suchen,aber das habe ich vergessen!!!,dass ich was in deine Code geändert habe! , Sorry nochmal !!! :Face: deine Programm hat mir schon geholfen und verwende ich weiter und Lerne auch Seher viel (ist einfach super kommentiert! :thumbup: ) Danke!
    mfg Besarion.

    2 Mal editiert, zuletzt von Besarion (1. Dezember 2016 um 01:03) aus folgendem Grund: wichtiges vergessen

  • Hallo @Besarion,

    nein, nein. Du hattest schon recht und die Fehlermeldung ja auch gepostet. Das war sehr gut, denn mir war das mangels Absturz nicht aufgefallen. Das war ein schlimmer Copy&Paste-Fehler. Ich habe eine korrigierte Version im ersten Beitrag angehängt.

    Deine Änderung in Zeile 625 (im neuen Skript 623) geht total in Ordnung. au3-Dateien wie txt zu behandeln ist genau richtig.
    Damit du sie dir auch ansehen kannst, musst du jedoch noch eine zweite Zeile bearbeiten!

    Die Mausklicks aus der Listview werden in der Funktion _WM_NOTIFY ausgewertet. Dort musst du dann auch noch au3 hinzufügen. Im aktuellen Skript Zeile 1884.

    Also der Fehler lag definitiv bei mir und nicht bei dir. Bastel dir ruhig weiter dein passendes Tool ;)

    Grüße autoiter

  • Hi,

    Ich habe das Skript kommentiert, damit man es etwas nachvollziehen kann.

    Mit Erfolg, man findet sich sehr schnell in das Script rein.

    Mir sind jedoch ein paar Sachen beim drübergucken aufgefallen:

    :!:


    1.

    AutoIt
    Global $iFontsize = Int(IniRead($hIni, "Font", "Edit", "8.5")) ; Die Standard-Schriftgröße für die $hDocGUI.

    Hier wird der eingelesene String in einen Integer umgewandelt, was Grundsätzlich richtig ist, allerdings rundet die Int Funktion auf ganze Zahlen ab.
    Daher werden Werte wie "8.5" nicht korrekt übernommen.
    Dies ist jetzt in diesem Fall ziemlich egal, jedoch kann es in anderen Umständen zu unerwarteten Ergebnissen führen.
    Also besser die Funktion Number() benützen.


    2.

    AutoIt
    $diff = TimerDiff($init) ; Suche ist beendet und die Gesamtzeit in Sec wird ermittelt.
    	$aTimer = StringSplit($diff, ".")
    
    
    	Local $fSec = StringTrimRight($aTimer[1], 3)
    	If $fSec = "" Then $fSec = 0
    	Local $uSec = StringTrimRight(StringRight($aTimer[1], 3), 1)
    	If StringLen($aTimer[1]) = 3 Then $fSec = 0

    Hier hast du die Dauer "einfach" mit String-Funktionen auf Sekunden "geschnitten".
    Dies lässt sich auch etwas einfacher lösen (s. Hilfe zu StringFormat(), lohnt sich bei solchen Anzeigen :) )

    AutoIt
    $iDiff_Sec = TimerDiff($hTimer) / 1000
    $sDiff = StringFormat("%0.2f", $iDiff_Sec)
    $sDiff = StringReplace($sDiff, ".", ",")
    MsgBox(0,"",$sDiff)

    3.

    AutoIt
    Switch $aPathSplit[$aPathSplit[0]] ; je nach Datei-Endung wird die entsprechende Funktion aufgerufen.
    Case $aPathSplit[$aPathSplit[0]] == "txt", "TXT"
    	$sString = _GetContent_TXT($aFolder[$i])

    Ich denke hier hast du Select-Case und Switch-Cast durcheinander geworfen.
    Zudem ist Switch-Case "case-insensitive".
    Besser wäre es so:

    AutoIt
    Switch $aPathSplit[$aPathSplit[0]]
       Case "txt"
    	  $sString = _GetContent_TXT($aFolder[$i])

    4.
    Inerhalb deiner GUIs werden vielen Controls die selben Resizing-Methoden zugewiesen, du kannst dir etwas C+P sparen wenn du statt dessen die "GUIResizeMode" Option benützt.
    z.B.

    AutoIt
    ;MainGUI
    Opt("GUIResizeMode", 2 + 32 + 256 + 512)
    GUICreate(...)
    GUICtrlSetResizing(...); Außnahmen festlegen
    ...
    ;ListGUI
    Opt("GUIResizeMode", 2 + 256 + 512 + 64)
    GUICreate(...)
    GUICtrlSetResizing(...); Außnahmen festlegen

    5.

    AutoIt
    GUICtrlSetData($idL_Files, $i & "/" & $iAllFiles & " Dateien") ; aktueller Fortschritt für das Label.

    Hier wird die Anzahl der Gefundenen Objekte falsch angezeigt.
    $iAllFiles entspricht nicht der Anzahl der Dateien, sondern ist immer eine weniger (selbiges bei $i).

    mfg
    Zeitriss

  • Hallo @Zeitriss,

    Mit Erfolg, man findet sich sehr schnell in das Script rein.

    das freut mich ja. :)

    Aber vor allem freuen mich die ganzen Code-Hinweise! Dass sich jemand mit deiner Klasse die Zeit nimmt, den Code genauer anzusehen, hätte ich nie erwartet. Dafür schien mir das Skript viel zu groß. Die Doku war in erster Linie für Anfänger geadacht, die sich ansehen können sollten, wie man etwas machen könnte.

    Alle deine Tipps sind auch total gut! Zwei Sachen sind mir peinlich, aber den Rest habe ich tatsächlich einfach nicht besser gewusst.

    So profunde Hilfe zu bekommen, ist für mich schön und bringt mich vor allem weiter. Vielen Dank dafür!

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (3. Dezember 2016 um 09:12) aus folgendem Grund: paar Details gestrichen

  • Ohne das Skript angeschaut zu haben:

    • Welches Betriebssystem?
    • In welchem Verzeichnis?
    • Hast du schon versucht dir @Error und @Extended ausgeben zu lassen?

    mfg (auto)Bert

  • Hallo @Kleffer,
    schau dir doch mal die Beiträge 4 und 5 an. ^^
    Das Skript durchsucht nur die definierten Dateiformate (weil sie unterschiedlich abgearbeitet werden). Alles andere wird in die Liste der übergangenen Dateien aufgenommen.
    Alternativ könntest du auch in der _SearchAndProgress Funktion den Funktionsaufruf _GetContent_TXT unter die Zeile "Case Else" schreiben, damit was nicht definiert ist, als Text zu lesen versucht wird.

    Grüße autoiter

  • Hey Leute,

    ich habe das Skript in der Zwischenzeit erweitert und es so viel besser geworden, dass ich es nochmal teilen wollte (eher an weniger erfahrene Nutzer gerichtet) .

    1. habe ich ein TextSuche-Programm von @wakillon entdeckt, dass ich wirklich ganz toll fand. Davon habe ich mir die Treffer-Vorschau bei der Auswahl abgeschaut. Er hat zwar hier ein Nutzerkonto, aber seine Programme hat er im englischen Forum gepostet. Der Link führt zu seiner Programmübersicht (weil das alles toll ist). Im Speziellen geht es aber um StringFinder. https://www.autoitscript.com/forum/profile/28198-wakillon/content/?type=downloads_file&sortby=file_views&sortdirection=desc&page=1

    2. Habe ich gelernt, dass es einen deutlichen Unterschied machen kann, ob man mit erst mit _FileListToArray(Rec) alle Dateien einsammelt und danach prüft, welche relevant sind oder eine eigene Funktion schreibt, die das bereits beim Einsammeln macht. Da habe ich mir eine Funktion von @Zeitriss angepasst.

    3. Hatte ich tatsächlich in der Schleife in der Suche (_SearchAndProgress) _ArrayAdd verwendet. Das habe ich durch ein übergroßes temporäres Array und eine Zählervariable ersetzt. Jedes neue Element wird einfach zugeordnet und am Ende gibt es ein ReDim auf die wirklich benötigte Größe. Anschließend wird das noch dem "Haupt"-Array ($aSQLFiles) angehängt. Das beschleunigt das Einlesen des AutoIt-Installationsverzeichnisses enorm (bei mir 5829 relevante Dateien. Einlesedauer alt: ~138 sek. Einlesedauer neu: ~50 sek! - habe SSD).


    Das Skript eignet sich weiterhin vor allem für wiederholte Suchen. Nach der ersten Suche kann man auch nur die Datenbank durchsuchen. Dann dauert das Durchsuchen der 5829 Dateien bei mir nur noch 1,6 Sekunden.

    Falls Dateien im Suchbereich gelöscht oder verändert werden, kann man Datenbankbereinigung aktivieren damit die Daten aus der DB entfernt werden. Es wird auch ein vacuum durchgeführt. Je nach Dateimenge, kann das aber etwas dauern.


    Das alte und das neue Skript sind dem ersten Beitrag angehängt, damit sich Interessierte auch die Änderungen anschauen können.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (11. März 2017 um 19:24)

  • Hallo Leute,
    da ich das Programm mal wieder anfassen musste, konnte ich einige Fehler beheben und auch neue Funktionen integrieren. Hier ein Update:

    Folgende Dinge wurden zuvorderst geändert:
    - Menü für Programmoptionen mit diversen Möglichkeiten wurde eingefügt.
    - Absturzursache beseitigt. (XLSX UDF wird nicht über #include eingebunden. Daher waren einige globale Variablen bisher nicht verfügbar).
    - Option eingeführt bei ä, ö, ü im Suchwort auch Treffer mit ae, oe und ue zu erzielen.
    - Die Suche nach doc-Dateien war suboptimal und läuft nun schneller (unnütze Suchvariante entfernt).


    Update im ersten Beitrag.

    Grüße autoiter

  • Mein Feedback als begeisteter Nutzer von Deiner Textsuche:

    -Die neue Option funktioniert sehr gut. Ae, oe und ue werden , wenn angehakt bestens entdeckt.
    -Das Durchsuchen von 8.200 Textdateien auf ein Schlagwort hat beim 2ten Mal nur 40 Sekunden samt Trefferanzeige gedauert. Beim ersten Mal war über Minuten hinweg kein Fortschritt zu sehen. Das Programm war aber nicht eingefroren. Das kann man ja gut am Festplattenzugriff erkennen.

    - Klasse würde ich zusätzlich finden, wenn die Liste der bereits gesuchten Stichworte mit einem Klick in der Gui gelöscht, als auch die Datenbank auf den Auslieferungszustand bereinigt werden könnte.

    Insgesamt kann ich mich nur wiederholen. Tolle Sache Dein Proggi und absolut funktional. Sehr gute Arbeit. Vielen Dank dafür.

  • Hallo @bazii,

    Super, dass du es auch gebrauchen kannst und so viele Dateien zum Durchsuchen hast :)
    Danke dir für das schöne Feedback.

    Beim ersten Mal war über Minuten hinweg kein Fortschritt zu sehen. Das Programm war aber nicht eingefroren. Das kann man ja gut am Festplattenzugriff erkennen.

    Gerade bei sehr vielen Dateien hatte das Programm noch die Schwäche, dass bei der Suche nach Dateien noch kein Feedback kam. Das wollte ich hier auch verbessern und unten links im Hauptfenster läuft ein Zähler für die gefundenen Dateien mit. Hast du das übersehen und sollte der Zähler bei der Fortschrittsanzeige liegen, oder ist dort unten auch kein Zähler sichtbar gewesen?
    (Allerdings dauert dieser Schritt bei mir im AutoIt Verzeichnis bei 5841 Dateien und SSD nur ein, zwei Sekunden. Auf nem Firmenserver-Verzeichnis wo etwa 5700 xls-Dateien liegen komme ich auf etwa 9 Sekunden. Daher müsste da irgendein Problem aufgetreten sein).
    Oder wurde überhaupt irgendwann während der Suche die Progressbar aktualisiert, oder hast du gestartet und irgendwann wurden einfach Ergebnisse gezeigt?
    Wäre super, wenn du das nochmal nachstellen kannst und vielleicht Bedingungen erkennst, wann das passiert. Das würde mich sehr interessieren.

    -Das Durchsuchen von 8.200 Textdateien auf ein Schlagwort hat beim 2ten Mal nur 40 Sekunden samt Trefferanzeige gedauert.

    Bei dieser Menge ändern sich sicher auch zwischen den Suchen nicht allzu viele Dateien. Ich nutze nach dem ersten Einlesen eigentlich immer "Nur Datenbanksuche". Da hat man die Ergebnisse in 0,x Sekunden. Nur bei Bedarf lasse ich dann nochmal die Dateien durchgehen.


    - Klasse würde ich zusätzlich finden, wenn die Liste der bereits gesuchten Stichworte mit einem Klick in der Gui gelöscht, als auch die Datenbank auf den Auslieferungszustand bereinigt werden könnte.

    Das könnte man auch als Menü integrieren, oder? So lässt sich das jedenfalls schnell umsetzen.

    Suchbegriffe lassen sich bisher einzeln mit Entf löschen und die Datenbank wird nur gelöscht, wenn man das Startverzeichnis ändert und Datenbankbereinigung bei der nächsten Suche aktiviert hat. Letzteres finde ich selbst auch schwach. (Ich habe das so gemacht, damit man überhaupt mal andere Verzeichnisse durchsuchen kann, ohne die bisherigen Einträge zu verlieren. Es wäre aber viel besser, es gäbe ein kleines Menü, in dem man für unterschiedliche Verzeichnisse eigene Tabellen sieht, die man löschen oder als aktuelle Suchliste auswählen könnte - bedeutet aber etwas Fleißarbeit).

    Grüße autoiter

  • Gerade bei sehr vielen Dateien hatte das Programm noch die Schwäche, dass bei der Suche nach Dateien noch kein Feedback kam. Das wollte ich hier auch verbessern und unten links im Hauptfenster läuft ein Zähler für die gefundenen Dateien mit. Hast du das übersehen und sollte der Zähler bei der Fortschrittsanzeige liegen, oder ist dort unten auch kein Zähler sichtbar gewesen?
    (Allerdings dauert dieser Schritt bei mir im AutoIt Verzeichnis bei 5841 Dateien und SSD nur ein, zwei Sekunden. Auf nem Firmenserver-Verzeichnis wo etwa 5700 xls-Dateien liegen komme ich auf etwa 9 Sekunden. Daher müsste da irgendein Problem aufgetreten sein).
    Oder wurde überhaupt irgendwann während der Suche die Progressbar aktualisiert, oder hast du gestartet und irgendwann wurden einfach Ergebnisse gezeigt?
    Wäre super, wenn du das nochmal nachstellen kannst und vielleicht Bedingungen erkennst, wann das passiert. Das würde mich sehr interessieren.


    Danke für Dein Feedback.

    Ich habe Dir zum besseren Verständnis ein Fünfminütiges Video aufgezeichnet, dass Dir mehr Aufschluss über das "scheinbare" Einfrieren geben kann.

    -Achte bitte nach 500 Dateien auf den Fortschrittsbalken. Bis dahin ist alles bestens.
    -Nach 1.000 Dateien sieht es schon anders aus. Kein Forschrittsbalken mehr zu sehen.
    -Aber nach 1.500 Dateien wieder ein Forschritsblaken sichtbar.
    -Nach 2.000 Dateien (am Ende vom Video) zeigt das Proggi "keine Rückmeldung" mehr an. Es suggestiert dem Benutzer ein einfrieren der Softw. doch es ist anders. Es läuft tadellos weiter bis zum Schluss.

    Nach ca. 18 Minuten war das Einlesen der ca. 8.000 Dateien beendet. (Erster Start nach neu entpackten Programmdateien).

    Datenbanksuche war hinterher in 0,3 Sek. absolut erfolgreich.

    Meine Arbeitsumgebung zum Test ist ein Notebook mit Win10 x64 und 8GB Ram ohne jedliche im Hintergrund laufende Sonderanwendung bis auf das Aufzeichnungsprogramm.

    Link zum Video:
    http://www.eibenkunst.de/Autoiter/Aufna…7_23_49_226.mp4 (IE oder Edge nutzen ! Firefox öffnet mir das Video leider nicht.)

    Suchbegriffe lassen sich bisher einzeln mit Entf löschen und die Datenbank wird nur gelöscht, wenn man das Startverzeichnis ändert und Datenbankbereinigung bei der nächsten Suche aktiviert hat. Letzteres finde ich selbst auch schwach.

    Schwach finde ich es gar nicht. Ich selbst habe aber die Vorliebe zur Spurenbeseitigung nach einer Schlagwortsuche. Das spielt ja aber bei der Bereinigung der DB weniger eine übergeordnete Rolle.
    Danke für den Tip mit der "Entf.-Taste". Das hatte ich schlichtweg übersehen, dass wenn ich bei der Auswahl des Suchtextes in der geöffneten Dropdown Liste das Wort markiere, den Suchtext löschen kann.

  • Hey Vielen Dank @bazii, :thumbup:

    Das Video ist .. schockierend. ;(
    Mir ist nämlich schleierhaft, warum das Schreiben der DB so lange dauert. Vielleicht werden Nicht-Textdateien eingelesen? Du könntest mal die Einträge aus der "unterstützte Textdatei-Typen.txt" löschen und nur txt darin belassen. Aber das ist ins Blaue geraten.

    Auch der Fehler mit der Fortschrittsanzeige kommt mir spanisch vor. Das ist ein Client-Fenster. Ich dachte das bleibt automatisch vor dem Parent. Aber bei dir sieht es ja so aus, als verschwinde es hinter dem Hauptfenster und erscheint erst wieder nachdem es aktualisiert wird?!?

    Ich bin ratlos. Vielleicht kann uns jemand hier helfen?

    Ich habe schon mal die Version mit den gewünschten Funktionen fertig und habe zusätzlich noch zwei Fehler gefunden.
    Einmal stimmte die Anzahl der Dateien nicht, wenn man nach der normalen Suche eine DB Suche startete und dann wurden docx gar nicht gefunden (ein Komma(!) vergessen).

    Grüße autoiter

  • Mir ist nämlich schleierhaft, warum das Schreiben der DB so lange dauert. Vielleicht werden Nicht-Textdateien eingelesen? Du könntest mal die Einträge aus der "unterstützte Textdatei-Typen.txt" löschen und nur txt darin belassen. Aber das ist ins Blaue geraten.

    Ich kann das morgen Abend gerne testen wenn ich von der Arbeit wieder zu Hause bin.

    Auch der Fehler mit der Fortschrittsanzeige kommt mir spanisch vor. Das ist ein Client-Fenster. Ich dachte das bleibt automatisch vor dem Parent. Aber bei dir sieht es ja so aus, als verschwinde es hinter dem Hauptfenster und erscheint erst wieder nachdem es aktualisiert wird?!?

    Der Fortschrittsbalken bleibt auch vor dem Fenster. Bei 500 DS kein Problem. Nur beim einlesen von 1.000 verschwindet es. Bei 1.500 wird es wieder angezeigt. Bei 2.000 auch.
    Ich muss schauen dass ich mich in den Code einlese. Vielleicht kann ich erkennen an was es liegen kann.

    Ich habe schon mal die Version mit den gewünschten Funktionen fertig und habe zusätzlich noch zwei Fehler gefunden.

    Hey super. Danke für die Mühe.

  • Hallo @bazii,

    Ich kann das morgen Abend gerne testen wenn ich von der Arbeit wieder zu Hause bin.

    Oh Mann. Heute? Dann wünsche ich dir wenigstens einen angenehmen Arbeitstag.


    Der Fortschrittsbalken ist für mich nicht das wichtigste Detail. Am meisten stört mich, dass das Schreiben in die DB so lange dauert. Ich muss mal mit einer langsamen Notebookfestplatte testen, ob das normal ist. Auf jeden Fall macht das so ja keinen Spaß. Und dabei ist es noch ein Glück, dass du "alle 500 Dateien in die DB schreiben" aktiviert gelassen hast. Sonst hätte das Programm die Dateien in ein, zwei Minuten eingelesen und danach hätte das Programm ne Viertelstunde, zwanzig Minuten ohne sichtbare Bewegung gehangen.

    Das Programm ist ja vor allem für wiederholte Suchen gedacht. Aber die erste Suche wollte ich so schnell wie möglich absolvieren. Daher wird in der _SearchAndProgress-Funktion in Schleife nur eine SQlite-Anweisung gebaut, die dann im Anschluss ausgeführt wird.

    AutoIt
    ...
    For $i = 0 To ..
    $sQuery &= "INSERT INTO ...
    Next
    _SQLite_Exec(-1, $sQuery)
    ...

    Das ist etwas schneller als wenn jedes mal die direkt in die DB geschrieben wird.
    Allerdings hat es eben den Nachteil, dass das Programm eine zeitlang in diesem Prozess hängt (Multithreading ist ja nicht) und nicht bedienbar ist. Mir schienen 500 Dateien seien aber noch ausreichend schnell geschrieben.. Man kann den Wert natürlich weiter senken, oder aber das gleich ganz verwerfen und direkt in die DB schreiben - das wäre die sauberste Lösung. Dann kannst du jederzeit mit Esc die Suche abbrechen und die bisherigen Ergebnisse ansehen.

    Im Anhang mal eine angepasste Variante. Ich fände es super, wenn du es mit dieser noch einmal probierst.
    Geänderte Zeilen (1018-1038):

    Spoiler anzeigen

    Ersetzt durch:

    Spoiler anzeigen

    Die Verzweigung mit dem " If $SQLITE_OK <> _SQLite_Exec(-1, $sQuery) Then" und dem ConsoleWrite soll hier zu Testzwecken dienen, damit du in der SciTE-Konsole siehst, was gerade in die DB geschrieben wurde. Das Fehlerauslesen ist vielleicht unnötig, aber im Video konnte man nicht sehen, ob es Error Messages in der Konsole gab. Interessanter sind vielleicht die Zeiten. Da kannst du sehen, ob es vielleicht einfach mit einigen Dateien Probleme gibt, oder ob das immer plausibel ist (natürlich benötigt eine kommentierte Ausgabe der Bibel mit Vorwort von Ghandi etwas mehr Zeit als eine Hello World.au3..).