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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
3-1119977045
Reals
2005-06-28 20:44
2005.08.07
Как сделать reconnect к MSSQL


3-1120204988
greySerg
2005-07-01 12:03
2005.08.07
Почему ADOTable не чистит за собой память ?


1-1121935230
AGENT
2005-07-21 12:40
2005.08.07
Курсоры


1-1121715510
JohnJ
2005-07-18 23:38
2005.08.07
Поиск компонентов


1-1121342706
MegaVolt
2005-07-14 16:05
2005.08.07
Подскажите простенькую замену TListView в виртуальном режиме.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский