Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie am besten einen Suchindex erstellen (https://www.delphipraxis.net/157223-wie-am-besten-einen-suchindex-erstellen.html)

LWChris 3. Jan 2011 22:52

Datenbank: Das ist die Frage • Version: - • Zugriff über: Auch die Frage

Wie am besten einen Suchindex erstellen
 
Hallo,

ich wollte ein Programm schreiben, mit dem man eine große Menge php-Dateien nach Kriterien wie vorkommende Funktionsnamen oder Variablennamen durchsuchen kann. Damit ich nicht immer alle Dateien auf der ganzen Festplatte durchrödeln muss, halte ich einen Suchindex für sinnvoll. Die Datei, in der ich das speichere, ist ja im Prinzip eine Datenbank mit Items von diesem Typ:

Delphi-Quellcode:
TPHPFile = class
private
  FFileName: String;
  FVars: array of String;
  ...
public
  constructor Create(FileName: String);
  function HasVar(VarName: String): Boolean;
  ...
  property FileName read FFileName;
  ...
end;
Haltet ihr es sinnvoll, das so zu speichern, also in einem "File of TPHPFile"? Oder würde dann eine Suche in meinem Suchindex mit 1000+ Objekten vom Typ TPHPFile Jahre dauern?

Wenn ihr mir zu einer richtigen Datenbank ratet, sei erwähnt, dass ich schon ausreichend SQL beherrsche, aber keine Ahnung davon habe, wie man mit Delphi Datenbanken anlegt, verwaltet oder durchsucht.

Könnt ihr mir 'nen Tipp geben? :oops:

Danke, Chris

P.S.: Kann ich in Turbo Delphi 2006 (also Delphi 10) irgendwie an ShellTreeView kommen? Ich würde TDirectoryListBox verwenden, aber da das deprecated ist und lt. Google und Forum ShellTreeView die neue Komponente dafür ist, frag ich mich, ob ich jetzt eine Version habe, wo die ListBox veraltet aber die ShellTreeView noch nicht dabei ist?

Edit:
Achso, den Ordner habe ich, aber wie komme ich jetzt an die VCL-Kompente? :)

s.h.a.r.k 4. Jan 2011 00:18

AW: Wie am besten einen Suchindex erstellen
 
Schau dir vielleicht mal in der IniFiles-Unit die Klasse THashedStringList an. Damit umgehst du dieses array of String und deine Suche innerhalb dieser Klasse würde recht effizient werden.

Bzgl der Komponente: Eigentlich heißt es pro Frage einen Thread. Schau dir aber mal pas-Dateien an und binde die in der uses-Klausel ein, in der die passenden Klassen liegen. Dann kannst du beim OnCreate die entsprechenden Komponenten erzeugen und die FormX als Parent setzen.

LWChris 4. Jan 2011 00:53

AW: Wie am besten einen Suchindex erstellen
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1072093)
Schau dir vielleicht mal in der IniFiles-Unit die Klasse THashedStringList an. Damit umgehst du dieses array of String und deine Suche innerhalb dieser Klasse würde recht effizient werden.

Okay, hab ich. Ich versteh nicht, wieso es funktioniert, aber das ist ja nicht so schlimm. Also würdest du mir tatsächlich zu einem Suchindex als Datei mit eigenen Einträgen raten? :-D

Zitat:

Zitat von s.h.a.r.k (Beitrag 1072093)
Eigentlich heißt es pro Frage einen Thread.

Tut mir leid, aber ich wollte nicht so viele Threads aufmachen, weil ich mir dann immer so doof vorkomme. 100 aufmachen aber nie die Lösung wissen. Alle Fragen, dich beantworten kann in DP sind immer schon beantwortet wenn ich sie entdecke :stupid: (ich guck immer mal so in die Foren). Naja, danke :) Ich habs versucht aber ich seh die Komponente nicht. Bin wohl zu blöd dafür :?

s.h.a.r.k 4. Jan 2011 00:59

AW: Wie am besten einen Suchindex erstellen
 
Die Komponente siehst du dann erst zur Laufzeit des Programms. Die Turbo-Edition ist so gestrickt, dass man keinerlei Komponenten in die IDE installieren kann. Daher musst du alles via Code machen. Wobei ich gehört haben soll, dass es da einen Trick gibt. Kann dir da aber leider nicht weiterhelfen.

Zu deinem Problem: THashedStringList nutze ich wenn ich quick'n'dirty eine gehashte Liste brauche, was für eine Suche sehr gut ist. Man kann diese nutzen, oder auch eine Datenbank. Wollte dir nur eine dateibasierte Lösung zeigen, mit der man sowas auch implementieren kann. Oder du nutzt evtl. doch eine Datenbank, wobei das insgesamt auf die Verwendung der Daten ankommt.

Was genau machst du mit dem Programm? Ändern sich die Daten von "außerhalb" (andere Tools)? Denn dann wäre eine ständige Überwachung oder Neuindexierung notwendig.

LWChris 4. Jan 2011 01:21

AW: Wie am besten einen Suchindex erstellen
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1072099)
Die Komponente siehst du dann erst zur Laufzeit des Programms.

Leider nicht, das ist ja das Problem :D Habs erzeugt und dann Top, Left, Width und Height gesetzt, aber ich seh nix^^

Habe aber gerade gesehen, dass ich mich vertan habe. FileCtrl ist gar nicht deprecated sondern Plattformspezifisch. Soll aber ohnehin nur unter Windows laufen (wird ja eine exe, es geht mir ja nicht um die .pas Datei), ist es also demnach egal, dass ich das verwende, richtig? :?:

Zitat:

Zitat von s.h.a.r.k (Beitrag 1072099)
Was genau machst du mit dem Programm? Ändern sich die Daten von "außerhalb" (andere Tools)? Denn dann wäre eine ständige Überwachung oder Neuindexierung notwendig.

Ja, die Daten ändern sich von außerhalb, aber meist nur minimal. Wirklich grundlegende Änderungen sind nicht sehr häufig. Eine veraltete Indizierung (Indexierung?) wäre aber nicht so schlimm, meines Wissens nach, denn der Abnehmer meines Programms wäre schonmal froh, wenn er auf der Suche nach den Dateien die Auswahl schneller eingrenzen kann. Da macht es nichts, wenn da noch eine Datei auftaucht, die mittlerweile keine Variable dieses Namens mehr enthält. Kannst du dir in etwa so vorstellen: ein großes Lager von php-Dateien, in denen viele Menschen rumwuseln und laufen irgendwelchen Code optimieren, wie er selber auch. Allerdings muss er eben von Zeit zu Zeit nachsehen, wie eine Funktion arbeitet oder ob es Funktionen gibt, die er bei seinen Aufgaben verwenden kann, oder ob er selber eine schreiben muss. Bspw sucht er nach einer Funktion "UpperCase" und muss dann wissen, in welcher php-Datei die drin ist. So stelle ich mir das, was er mir beschrieb, vor. :)

Danke für die Hilfe :thumb:

s.h.a.r.k 4. Jan 2011 03:09

AW: Wie am besten einen Suchindex erstellen
 
Zu deinem Komponenten-Thema: neuen Thread aufmachen!

Naja, wenn eine gute Dokumentation vorhanden ist, dann macht doch einfach ein Wiki draus? Oder eben eine andere Dokumentation, in der man sich bewegen und suchen kann.

Alternativ würde ich an der Stelle fast eine DB-Vorschlagen, da diese wesentlich mächtiger ist als die genannte THashedStringList. SQLite oder Firebird Embedded wären hier ein Anfang. Im Forum findest du massig Threads zu diesen beiden DBMS.

LWChris 5. Jan 2011 05:17

AW: Wie am besten einen Suchindex erstellen
 
Ich hab mir die IniFiles-Unit mal ganz zu Herzen genommen und erstelle meinen Index jetzt als TIniFile:

Code:
[C:\Program Files\xampp\htdocs\index.php]
IndexDate=2011/01/05
IndexTime=05:33:09:623
Variables=title,parsed,ucnext,letter
Functions=firstLetterUpperCase
Die 4 Abschnitte kann ich dann schön einfach wieder auslesen. Zur Programminternen Organisation nehme ich dann tatsächlich HashedStringLists, da ich beim Parsen ja immer überprüfen muss, ob das nicht schon drin ist (Duplicates:=dupIgnore funktioniert irgendwie nicht :?). Mit der Eigenschaft DelimitedText kann ich dann wunderbar die Werte einlesen und ausgeben für die Anzeige :)

Dank guter Vorarbeit für meinen Parser, der die php-Dateien nach den Variablen und Funktionen durchkämmt, braucht die Indizierung von 5000 Zeichen Quelltext keine 5ms. Das dürfte für die Geschwindigkeit ausreichen :D

Danke für die Hilfe! :thumb:

P.S.: Ich hab mich ja bisher immer im IniFiles drumherum gedrückt, aber irgendwie bin ich jetzt Fan davon. Der Code sah schwierig aus als ich ihn mir zum ersten Mal ansah, aber jetzt, wo ich erfahrener bin und die Anwendungen komplexer werden bin ich über diese Erleichterung dankbar :D

alzaimar 5. Jan 2011 06:40

AW: Wie am besten einen Suchindex erstellen
 
Alternative: Ein ordentliche RDBMS mit Volltextsuche.

DeddyH 5. Jan 2011 08:13

AW: Wie am besten einen Suchindex erstellen
 
Zitat:

Zitat von LWChris (Beitrag 1072305)
Duplicates:=dupIgnore funktioniert irgendwie nicht

Ich weiß nicht, wie es bei der HashedStringlist ist, aber bei der "normalen" Stringlist funktioniert das auch nur in Verbindung mit Sorted := true.

LWChris 6. Jan 2011 07:07

AW: Wie am besten einen Suchindex erstellen
 
Zitat:

Zitat von DeddyH (Beitrag 1072318)
Zitat:

Zitat von LWChris (Beitrag 1072305)
Duplicates:=dupIgnore funktioniert irgendwie nicht

Ich weiß nicht, wie es bei der HashedStringlist ist, aber bei der "normalen" Stringlist funktioniert das auch nur in Verbindung mit Sorted := true.

Ach Mist, ich wusste mal, dass man das machen muss. Habs aber wieder vergessen :stupid: Danke :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz