Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизБыстрый поиск в текстовом файле Найти похожие ветки
← →
Domkrat © (2005-09-21 13:52) [0]Доброго дня.
Ув. мастера, если у кого - нибудь есть алгоритм быстрого поиска в большом! текстовом файле, поделитесь пожста.
Может по методу Boyer-Moor - а или что нибудь в этом роде.
← →
Digitman © (2005-09-21 13:53) [1]и что мы ищем там ?
← →
Domkrat © (2005-09-21 14:03) [2]Текст различной длины, допустим до 255 символов.
← →
Anatoly Podgoretsky © (2005-09-21 14:10) [3]Тест сортированый?
← →
ShiFT (2005-09-21 14:20) [4]http://algolist.manual.ru/search/index.php
← →
Domkrat © (2005-09-21 14:21) [5]Сори, не пойму что значит сортированный. Смысл - поиск определенной строки в файлах.
← →
Anatoly Podgoretsky © (2005-09-21 14:36) [6]Алгоритмы разные.
← →
Digitman © (2005-09-21 14:49) [7]
> Domkrat © (21.09.05 14:21) [5]
пример "сортированнго" (по неким соглашениям и критериям) списка строк :
Вася
Вася - мастер
Петя
Петя - подмастерье
он же , но не сортированный:
Петя
Вася - мастер
Петя - подмастерье
Вася
any questions ?
← →
umbra © (2005-09-21 15:07) [8]А регэксы не подойдут? Очень мощная штука. Модуль для Делфи есть на
http://RegExpStudio.com
← →
Domkrat © (2005-09-21 15:10) [9]Спасибо всем.
Думаю что >ShiFT (21.09.05 14:20) [4] для начала достаточно, что бы изучить мат часть.
← →
Domkrat © (2005-09-21 15:12) [10]>umbra © (21.09.05 15:07) [8]
Спасибо гляну.
← →
RDS © (2005-09-21 15:48) [11]Держи, вот завалялось, правда не мое.
=====================================================
Держите, в 100 мегабайтном файле находит строку менее чем за 1 сек., возможно нужны поправки. Будут вопросы - задавайте.
Type TBuffer = Array[0..1000000-1] of byte;
PBuffer = ^TBuffer;
Function CharPos(AChar:Char; Buffer:Pointer; Size:Integer):Integer;Assembler;
Asm
Cld
Push Es
Push EDi
Push Ds
Pop Es
Mov Al , AChar
Mov EDi, Buffer
Mov ECx, Size
Push ECx
Repne ScasB
Pop EAx
Jnz @@NotMatch
Sub EAx, ECx
Mov Result, EAx // This is odd when optimization is on
Jmp @@Exit
@@NotMatch:
Mov Result, -1
@@Exit:
Pop EDi
Pop Es
End;
Function CompareStrings(Constant:String; Buffer:PBuffer):Boolean;
Var I:Integer;
Begin
Result := True;
I := 1;
While Result and (I<Length(Constant)) Do
Begin
Inc(I);
Result := Result and (Constant[i] = Chr(Buffer^[i-2]));
End;
End;
Function LoadBuffer(var Buffer; var F:File; var SeekPos:Int64):Integer;
Begin
Seek(F, SeekPos);
BlockRead(F, Buffer, 1000000, Result);
SeekPos := FilePos(F);
End;
Function ConstantExists(FileName, Constant: String):Boolean;
Var Buffer : PBuffer;
SeekPos : Int64;
F : File;
BufSize : Integer;
BufPos : Integer;
SearchResult : Integer;
Begin
Result := False;
If FileExists(FileName) Then
Begin
SeekPos := 0;
New(Buffer);
Assign(F, FileName);
Reset(F,1);
Repeat
BufSize := LoadBuffer(Buffer^, F, SeekPos);
BufPos := 0;
While (Not Result) and (BufPos>=0) Do
Begin
SearchResult := CharPos( Constant[1], @Buffer^[BufPos], BufSize-BufPos );
If SearchResult>0 Then BufPos := BufPos + SearchResult
Else BufPos := -1;
If SearchResult<>-1 Then
Begin
Result := CompareStrings(Constant, @Buffer^[BufPos]);
BufPos := BufPos + 1;
End;
If BufPos>=BufSize Then BufPos := -1;
End;
Until (BufSize=0) Or Result;
Close(F);
End;
End;
procedure TForm1.Button3Click(Sender: TObject);
begin
If ConstantExists(Edit1.Text, Edit2.Text) Then
ShowMessage("Found")
Else
ShowMessage("Not Found");
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c