Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Более эффективный поиск в файле   Найти похожие ветки 

 
286 ©   (2005-07-15 11:28) [0]

Здравствуйте мастера. У меня возник вопрос по поиску в большом файле. Только не смейтесь мастера, как могу так и ищу. Вот фрагмент кода:   Правдо, только не очень смейтесь
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 сек. А намечается у меня поиск в базе, и такой способ вообще не эффективен.
                                             Спасибо


 
ЮЮ ©   (2005-07-15 11:30) [1]

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

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

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


 
286 ©   (2005-07-15 11:37) [2]

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


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

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

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

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 16:50) [4]

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

if list.IndexOf(nomerpasporta)>-1


 
286 ©   (2005-07-15 16:55) [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.

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


 
Poirot ©   (2005-07-15 17:02) [6]

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


 
MegaVolt ©   (2005-07-15 17:52) [7]

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

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 мегов!!!


 
286 ©   (2005-07-16 16:31) [8]

Да легко. Держи функцию.
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-18 10:51) [9]

И где файлик?



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

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
4-1118123405
Иксик
2005-06-07 09:50
2005.08.07
Узнать имя залогированного пользователя по IP или имени машины?


14-1121262155
lookin
2005-07-13 17:42
2005.08.07
У кого есть свой сайт со своими фотоматериалами?


5-1092211388
segor
2004-08-11 12:03
2005.08.07
События свойства компонента


14-1121716018
KOVKA_A
2005-07-18 23:46
2005.08.07
Я знаю как отдохнуть!


1-1121694103
Punch
2005-07-18 17:41
2005.08.07
TreeView с ChekBox оми.