Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Вниз

Вы не подскажете алгоритм поиска слова в тексте...   Найти похожие ветки 

 
Slavok   (2002-10-18 18:04) [0]

Дело в том, что мне надо найти все файлы содержащие данное слово. Через какой алгоритм осуществлять поиск, мне не приходит в голову, кроме как:
Я тут в поиске нашёл, как в RichEdit поиск осуществлять:

procedure TForm1.Button1Click(Sender: TObject);
begin
FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
FindDialog1.Execute;end;
procedure TForm1.FindDialog1Find(Sender: TObject);
var FoundAt: LongInt;
StartPos, ToEnd: Integer;
begin with RichEdit1 do
begin { begin the search after the current selection if there is one } { otherwise, begin at the start of the text }
if SelLength <> 0 then
StartPos := SelStart + SelLength;
else
StartPos := 0; { ToEnd is the length from StartPos to the end of the text in the rich edit control }
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end;
end;
end;

Так что можно загнать текст в RichEdit, а потом там осуществить поиск, но ведь размеры файла могут помешать...


 
Kibitzer   (2002-10-18 19:01) [1]

Тебе нужно найти на диске (или в папке) файл содержащий определённое слово, и для этого ты хочешь загружать каждый файл в RichEdit и его средствами искать? Мда, не лучший алгоритм...


 
VictorT   (2002-10-18 20:14) [2]

Просто читаешь посимвольно файл и сверяешь с искомым словом. Вот и весь алгоритм.


 
Dm9   (2002-10-18 20:45) [3]

Из 2-х зол лучше уж загонять текст в memo и использовать его св-во text
Edit1.Text := IntToStr (Pos (YourStr, Memo1.Text));


 
алгоритм Бойера - Мура,   (2002-10-18 20:48) [4]

например.


 
Kotka   (2002-10-18 22:52) [5]

Вот пример моей программки:

unit NewFinder1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Masks, ShellApi, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
List1: TListBox;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;

procedure SearchInDir(Mask, Dir: string; Subdir: Boolean; var List: tStringList);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
words:array of string;
exist:array of boolean;
flag:boolean;
fl:textfile; kol:integer;
tmpdir:string;
implementation

{$R *.dfm}
procedure tform1.SearchInDir(Mask, Dir: string; Subdir: Boolean; var List: tStringList);
var
r,i: integer;
f: TSearchRec;s:string;
begin
if Dir = "" then Exit;
if Dir[Length(Dir)] <> "\" then Dir := Dir + "\";
{$I-}
ChDir(Dir);
{$I+}
i:= IOResult;
if i <> 0 then Exit;
r := FindFirst("*.*", faAnyFile, f);
while r = 0 do
begin

if MatchesMask(f.Name, Mask) then
if (f.Name <> ".") and (f.Name <> "..") then
begin
for i:=0 to kol do
exist[i]:=false;
if fileexists(ExpandFileName(f.Name)) then
begin
assignfile(fl,ExpandFileName(f.Name));
reset(fl);
while not eof(fl) do
begin
label3.Caption :=ExpandFileName(f.Name);
application.ProcessMessages;
readln(fl,s);
s:=ansilowercase(s);
for i:=0 to kol do
if pos(words[i],s)<>0 then
exist[i]:=true;
end;
flag:=true;
for i:=0 to kol do
flag:=(flag)and(exist[i]);
if flag then
List.Add(ExpandFileName(f.Name));
closefile(fl);
end;
end;
if (f.Attr and faDirectory) = faDirectory then
if SubDir = True then
begin
if (f.Name <> ".") and (f.Name <> "..") then
begin
SearchInDir(Mask, ExpandFileName(f.Name), SubDir, List);
ChDir(Dir);
end;
end;
r := FindNext(f);
end;
FindClose(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
var list:tstringlist;
i,x,tmp,l:integer;
s,s1,s2:string;
path:array[0..254]of char;
begin
s:=edit2.Text ;x:=0;
list:=tstringlist.Create;
for i:=1 to length(s) do
if s[i]=" " then
x:=x+1;
x:=x+1;
setlength(words,x);
setlength(exist,x);kol:=x-1;x:=0;tmp:=1;
s:=s+" ";
for i:=1 to length(s) do
if (s[i]=" ") then
begin
words[x]:=ansilowercase(copy(s,tmp,i-tmp));
if words[x]<>"" then
x:=x+1;
tmp:=i+1;
end;
s:=edit1.Text ;
for i:=1 to length(s) do
if s[i]="\" then
x:=i;
s1:=copy(s,x+1,length(s)-x);
s2:=copy(s,1,x);
searchindir(s1,s2,true,list);
list1.items :=list;
label3.Caption :="Готово";
end;

end.

В Edit2 содержутся слова, а в Edit1 - путь вида C:\Windows\*.txt



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
4-101582
d-coder
2002-09-19 23:29
2002.10.31
Получение функций из DLL: каким образом???


4-101569
МИФИст
2002-09-18 19:32
2002.10.31
WM_VSCROLL


1-101234
lipskiy
2002-10-20 23:17
2002.10.31
Неявное описание типа данных? (Структура для настроек программы)


1-101225
Граф
2002-10-21 14:56
2002.10.31
Сейчас буду канючить. Не могу разобраться с пулом потоков


1-101325
maxim2
2002-10-17 10:14
2002.10.31
Градиентная заливка форм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский