Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Более эффективный поиск в файле [D6, WinME]


286 ©   (2005-07-15 11:28:00) 

Здравствуйте мастера. У меня возник вопрос по поиску в большом файле. Только не смейтесь мастера, как могу так и ищу. Вот фрагмент кода:   Правдо, только не очень смейтесь
function VidatDigitalCode(Pasport : integer) : integer;
label 1, 2, 3;
var
 f : File of char;
 buf : char;
 slovo, naidenypasport : string[3];
 kod : string[4];
begin
 kod :='';
 AssignFile (f, 'd:\chasovoi\test.dat');
 Reset (f);
 while not Eof(f) do
 begin
1:  Read (f, buf);
   if buf = '/' then
   begin
     repeat
       Read (f, buf);
        if (buf = #$D) or (buf = #$A) then goto 2;
        if (buf = ';') then goto 2;
        slovo := slovo + buf;
        naidenypasport :=slovo;
2:   until buf = ';';
   slovo :='';
   if StrToInt (naidenypasport) = Pasport then // Паспорт найден
   begin
     Read (f, buf);
     Read (f, buf);
     Read (f, buf);
     repeat
       kod :=kod + buf;
       Read (f, buf);
     until buf = ';';
     VidatDigitalCode :=StrToInt (kod);
     goto 3;
   end
   else goto 1;
   end;
 end;
3:CloseFile (f);
end;

А файл по сути простой и вида:
/1;
938;
9.57087;
/2;
0;
0;
/3;
0;
0;
/4;
9;
0;
и т.д. всего 3475 записей такого вида.
Мастера, подкиньте пожалуйтста алгоритм более эффективного поиска, а то я для примера вставляю в функцию макс. значение, и жду как дубина около 10 сек. А намечается у меня поиск в базе, и такой способ вообще не эффективен.
                                             Спасибо


MegaVolt   (2005-07-18 10:51:00) [1]

И где файлик?


286   (2005-07-16 16:31:00) [2]

Да легко. Держи функцию.
function VidatParametrName (Pasport : integer) : string;
label 3;
var
 f : file of char;
 buf : char;
 naideniypasport : string[3];
begin
 AssignFile (f, 'd:\chasovoi\parametr.cfg');
 Reset (f);
 while not Eof(f) do
 begin
   Read (f, buf);
   if buf = '/' then
   begin
     Read (f, buf);
     if buf = '/' then
     begin
       Read (f, buf);
       if buf = ' ' then
       begin
         Read (f, buf);
         repeat
           naideniypasport :=naideniypasport + buf;
           Read (f, buf);
         until (buf = #$D) or (buf = #$A) or (buf = ' ');
         if StrToInt(naideniypasport) = Pasport then
         begin
           ShowMessage (naideniypasport);
           goto 3;
         end
         else naideniypasport :='';
       end;

     end;
   end;

 end;
3:CloseFile (f);
end;

так, ща придумаю куда файл скинуть.


MegaVolt   (2005-07-15 17:52:00) [3]

>Да в базах все это проще чем в текстовом файле. И гораздо быстрее.
Это с какого перепугу? Если поиск не по индексированному полю или поиск по маске то скорость соизмерима :)

286
1.Чтобы эта хрень работала быстрее для начала начни читать большими кусками. В идеале по 32К. Тогда само чтение с веника не будет тормозить. Если не веришь сравни время чтения побайтно файла и время чтения по 32К

2. slovo := slovo + buf;
  naidenypasport :=slovo;

тоже по большому счёту потеря времени хотя мизерная но всё же.
лучше бы так naidenypasport[i]:=buf; где i я так понимаю от 1 до 3.
3. 3475 записей в среднем по 4-5 символов это всего 15кило. И это обрабатывается 10 сек? Скинь полную прогу и файл. Дай взглянуть на это :)

Чтобы не быть голословным за 10 сек на 666 P-3 делается полнотекстный поиск по маске на файле более 60 мегов!!!


Poirot   (2005-07-15 17:02:00) [4]

>> Вот какой я клёвый
И не говорика - клевее не бывает :)))


286   (2005-07-15 16:55:00) [5]

Во я дурак, есть же такая штука как HELP

Returns the position of a string in the list.

function IndexOf(const S: string): Integer; override;

Description

Call IndexOf to obtain the position of the first occurrence of a string that matches S. A string matches S if it is identical to S or, if CaseSensitive is False, if it differs only in case.

IndexOf returns the 0-based index of the string. Thus, if S matches the first string in the list, IndexOf returns 0, if S is the second string, IndexOf returns 1, and so on. If the string does not have a match in the string list, IndexOf returns -1.

Вот какой я клёвый


286   (2005-07-15 16:50:00) [6]

ребят, расшифруйте строчку пожалуйста

if list.IndexOf(nomerpasporta)>-1


gydvin   (2005-07-15 11:38:00) [7]

Да в базах все это проще чем в текстовом файле. И гораздо быстрее.

А что касаемо поиска в тексте. Попробуй так.

var
list:tstringlist;
begin
list:=tstringlist.create;
list.loadfromfile(filename);
if list.IndexOf(nomerpasporta)>-1 then showmessage('Íàéäåí')else
showmessage('ÍÅÍàéäåí')
 list.Free;
end;


286   (2005-07-15 11:37:00) [8]

Немного разъясню. Этот файл только после такой обработки пожже перенесется уже в базу. А это - дос файл.
Хотя правдо, надо мне спросить в конф. базы данных, можно ли этот файл сразу подогнать под базу. Тогда то SQL оттуда уже элементарно выдрать значения.
Пасибо вам


ЮЮ   (2005-07-15 11:30:00) [9]

>а то я для примера вставляю в функцию макс. значение, и жду как дубина около 10 сек. А намечается у меня поиск в базе

В базе будет проще:
 SELECT MAX(поле) FROM таблица

так что не заморачивайся на пустяках, иди в базы


Наверх

Титульная страница Поиск, карта сайта Написать письмо