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

Вниз

Быстрый способ нахождения строки в файле   Найти похожие ветки 

 
QuickFinder   (2006-03-18 02:10) [0]

Имеется бинарный файл (с текстовыми и нетекстовыми символами).
Требуется найти количество вхождений строки XYZ и позиции этих вхождений.

Пока единственное, что приходит в голову, - это открыть файл через TFileStream и читать каждый байт. Но это очень медленно, если файл большой.
Есть ли более быстрый способ?

Когда открываю файл в FAR-е и начинаю поиск этой строки, то он работает довольно шустро.


 
Германн ©   (2006-03-18 02:38) [1]


> QuickFinder   (18.03.06 02:10)  
>
> Имеется бинарный файл (с текстовыми и нетекстовыми символами).
>
> Требуется найти количество вхождений строки XYZ и позиции
> этих вхождений.

Для поиска вхождений есть много алгоритмов, например:
"Boyer-Moore-Horspool pattern searching
algorithm".
А применить алгоритм для вычисления количества вхождений и определения позиций этих вхождений - это гораздо менее сложная задача, чем "пятничные  задачи от MBO".


 
QuickFinder   (2006-03-18 02:58) [2]

Повторяю:
Имеется бинарный файл (с текстовыми и нетекстовыми символами).

То есть простым Pos(Subst, Str) здесь НЕ обойтись.


 
Джо ©   (2006-03-18 03:04) [3]

>
> [2] QuickFinder   (18.03.06 02:58)
> Повторяю:
> Имеется бинарный файл (с текстовыми и нетекстовыми символами)
> То есть простым Pos(Subst, Str) здесь НЕ обойтись.

Почему?


 
Германн ©   (2006-03-18 03:06) [4]


> uickFinder   (18.03.06 02:58) [2]
>
> Повторяю:
> Имеется бинарный файл (с текстовыми и нетекстовыми символами).
>
>
> То есть простым Pos(Subst, Str) здесь НЕ обойтись.
>

Ну если тебе не лень, то повторяй.


 
Джо ©   (2006-03-18 03:12) [5]

Несмотря на возмущенные крики истца со своего места, все-же, посоветую еще кой-чего :)
Спроецируй файл в память (ключевый слова для поиска File mapping), затем производи поиск при помощи функции ComareMem. Скорости, для большОго числа прикладных задач, должно хватить. Если ее все-же не хватит, тогда уже и ищи "хитрые" алгоритмы.


 
TUser ©   (2006-03-18 05:25) [6]

Для строки XYZ не надобен Бойер-Мур, а нужен алгоритм Shift-And.


 
QuickFinder   (2006-03-18 10:19) [7]


> Джо ©   (18.03.06 03:04) [3]
> > То есть простым Pos(Subst, Str) здесь НЕ обойтись.
>
> Почему?


Я пробовал определить количество вхождений таким образом:

function SubStrCount(Substr, Str: string): Integer;
var
 I: Integer;
begin
 Result := 0;
 if (Substr = "") or (Str = "") then
   Exit;

 I := Pos(Substr, Str);
 while I > 0 do
 begin
   Inc(Result);
   Str := Copy(Str, I + Length(Substr), Length(Str));
   I := Pos(Substr, Str);
 end;
end;

Первое вхождение он находит, но не больше (а их точно больше). Дело в Copy?


 
Плохиш ©   (2006-03-18 10:59) [8]

PosEx


 
QuickFinder   (2006-03-18 11:07) [9]

Плохиш, а в каком модуле искать PosEx? В Delphi 5 его по ходу нет.


 
QuickFinder   (2006-03-18 11:23) [10]

Плохиш, будь ласка, запости сюда рутину PosEx.


 
Плохиш ©   (2006-03-18 11:57) [11]

> QuickFinder   (18.03.06 11:07) [9]
> Плохиш, а в каком модуле искать PosEx? В Delphi 5 его по
> ходу нет.

В Д7 она есть. Зачем Д7 в списке указывал?

> QuickFinder   (18.03.06 11:23) [10]
> Плохиш, будь ласка,

Ой, я сейчас покраснею..

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
 I,X: Integer;
 Len, LenSubStr: Integer;
begin
 if Offset = 1 then
   Result := Pos(SubStr, S)
 else
 begin
   I := Offset;
   LenSubStr := Length(SubStr);
   Len := Length(S) - LenSubStr + 1;
   while I <= Len do
   begin
     if S[I] = SubStr[1] then
     begin
       X := 1;
       while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
         Inc(X);
       if (X = LenSubStr) then
       begin
         Result := I;
         exit;
       end;
     end;
     Inc(I);
   end;
   Result := 0;
 end;
end;


 
QuickFinder   (2006-03-18 13:19) [12]


> Джо ©   (18.03.06 03:12) [5]
> Несмотря на возмущенные крики истца со своего места, все-
> же, посоветую еще кой-чего :)
> Спроецируй файл в память (ключевый слова для поиска File
> mapping), затем производи поиск при помощи функции ComareMem.
>  Скорости, для большОго числа прикладных задач, должно хватить.
>


Мне тоже кажется, что нужно смотреть в этом направлении.
Открываю довольно большой файл в UltraEdit-е, мигом открыл и все отобразил (в текстовом и шестнадцатиричном виде).



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

Форум: "Основная";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.015 c
6-1136971997
Dimich1978
2006-01-11 12:33
2006.04.23
Прописать свою прогу в Разрешенные (Брандмауер)


15-1144250794
Дурак
2006-04-05 19:26
2006.04.23
Вопросик сложный


15-1143665763
zeman
2006-03-30 00:56
2006.04.23
Нужна помощь


15-1143871258
boriskb
2006-04-01 10:00
2006.04.23
Кто то еще помнит.


2-1144710950
Neiroman
2006-04-11 03:15
2006.04.23
стандартный диалог с Edit`ом





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