Форум: "Основная";
Текущий архив: 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