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

Вниз

Быстрый поиск в большом текстовом файле   Найти похожие ветки 

 
Hadroran   (2010-10-14 10:58) [0]

Привет всем.
Помогите с кодом поиска текста в большом текстовом файле загруженном в StringList.
Вот нашел код

function BMFind(szSubStr, buf: PChar; iBufSize: integer;
 wholeword_only: boolean): integer;
 { Returns -1 if substring not found,
 or zero-based index into buffer if substring found }
var
 iSubStrLen: integer;
 skip: array [char] of integer;
 found: boolean;
 iMaxSubStrIdx: integer;
 iSubStrIdx: integer;
 iBufIdx: integer;
 iScanSubStr: integer;
 mismatch: boolean;
 iBufScanStart: integer;
 ch: char;
begin
 found := False;
 Result := -1;
 iSubStrLen := StrLen(szSubStr);
 if iSubStrLen = 0 then
 begin
   Result := 0;
   Exit
 end;

 iMaxSubStrIdx := iSubStrLen - 1;
 { Initialise the skip table }
 for ch := Low(skip) to High(skip) do skip[ch] := iSubStrLen;
   for iSubStrIdx := 0 to (iMaxSubStrIdx - 1) do
     skip[szSubStr[iSubStrIdx]] := iMaxSubStrIdx - iSubStrIdx;

 { Scan the buffer, starting comparisons at the end of the substring }
 iBufScanStart := iMaxSubStrIdx;
 while (not found) and (iBufScanStart < iBufSize) do
 begin
   iBufIdx := iBufScanStart;
   iScanSubStr := iMaxSubStrIdx;
   repeat
     mismatch := (szSubStr[iScanSubStr] <> buf[iBufIdx]);
     if not mismatch then
       if iScanSubStr > 0 then
       begin // more characters to scan
         Dec(iBufIdx); Dec(iScanSubStr)
       end
       else
         found := True;
   until mismatch or found;
   if found and wholeword_only then
   begin
     if (iBufIdx > 0) then
       found := not IsCharAlpha(buf[iBufIdx - 1]);
     if found then
       if iBufScanStart < (iBufSize - 1) then
         found := not IsCharAlpha(buf[iBufScanStart + 1]);
   end;
   if found then
     Result := iBufIdx
   else
     iBufScanStart := iBufScanStart + skip[buf[iBufScanStart]];
 end;
end;

function StringInFile(strFind, strFileName: string): boolean;
const
 BUFSIZE = 8192;
var
 fstm: TFileStream;
 numread: Longint;
 buffer: array [0..BUFSIZE-1] of char;
 szFind: array [0..255] of char;
 found: boolean;

begin
 StrPCopy(szFind, strFind);
 found := False;
 fstm := TFileStream.Create(strFileName, fmOpenRead);
 repeat
   numread := fstm.Read(Buffer, BUFSIZE);
   if BMFind(szFind, Buffer, numread, false) >= 0 then
       found := True

   else if numread = BUFSIZE then // more to scan
     fstm.Position := fstm.Position - (Length(strFind)-1);

     inc(readed,numread);
     if readed mod 4096 = 0 then
       begin
         form1.label1.caption:= inttostr(readed div 1024 div 1024)+ " mb read" ;
         Application.ProcessMessages
       end;
 until found or (numread < BUFSIZE);
 fstm.Free;
 Result := found;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if StringInFile("Find Text","путь\имя_файла.txt") then ShowMessage(format("found at %u",[readed]));
end;

Данный алгоритм работает и быстро, но мне необходимо узнать номер строки и столбца для дальнейшей обработки строки.


 
Сергей М. ©   (2010-10-14 11:40) [1]


> Вот нашел код


Не то ты нашел.
Никаким стринглистом в нем даже не пахнет.


 
Hadroran   (2010-10-14 11:59) [2]

я знаю что не пахнет. решать то задачу надо. вот и извращаюсь.


 
Сергей М. ©   (2010-10-14 12:17) [3]

А зачем вообще файл бешеного размера грузить в стринг лист ?
Разумное объяснение этой необходимости есть ?


 
Hadroran   (2010-10-14 12:23) [4]

txt файл в 55 метров прайс лист. Необходимо найти в нем выбранный товар и заменить цену. удовлетворил любопытство?
в стринг лист быстрее грузится чем в мемо. других вариантов решения пока не знаю ((


 
Сергей М. ©   (2010-10-14 12:28) [5]


> удовлетворил любопытство?


Угу.
Но сомнения в необходимости использования для этой цели стринлиста только усилились)
Прайс-лист этот наверняка ведь имеет регулярную структуру записей ?
Так что же мешает воспользоваться механизмом регул.выражений ?
Например, с использованием готовой ее реализации в виде довольно известного класса TRegExpr ?


 
Hadroran   (2010-10-14 12:29) [6]

а как там организовать поиск


 
Сергей М. ©   (2010-10-14 12:30) [7]

К TRegExpr штатно прилагается достаточно вменяемая русскоязычная справка


 
Hadroran   (2010-10-14 12:52) [8]

сичас папробую )))


 
Anatoly Podgoretsky ©   (2010-10-14 13:19) [9]


> я знаю что не пахнет. решать то задачу надо. вот и извращаюсь.

Знаешь, но это тебя никак не сдерживает.


 
Игорь Шевченко ©   (2010-10-14 14:23) [10]


> в стринг лист быстрее грузится чем в мемо. других вариантов
> решения пока не знаю ((


нанять программиста


 
Anatoly Podgoretsky ©   (2010-10-14 14:27) [11]

А у "Этого" не получится?


 
KilkennyCat ©   (2010-10-14 21:41) [12]


> в стринг лист быстрее грузится чем в мемо

чтобы что-то найти, необязательно куда-то грузить, достаточно открыть.
а скорости там одинаковые, потеря лишь на отображение.

я бы не стал завязываться на регвыражения, если структура есть, или хотя бы подобие структуры, нет никаких проблем пробежаться по файлу.
а если структуры практически нет - нужно создавать и внедрять.



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

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

Наверх





Память: 0.49 MB
Время: 0.003 c
2-1287052049
b86
2010-10-14 14:27
2011.01.09
Завести процедуру даблклик


11-1227688343
Danger
2008-11-26 11:32
2011.01.09
Насчет работы с com-портом


2-1287351196
Германн
2010-10-18 01:33
2011.01.09
Caption на кнопках ToolBar


2-1287039502
Hadroran
2010-10-14 10:58
2011.01.09
Быстрый поиск в большом текстовом файле


15-1284970647
ocean
2010-09-20 12:17
2011.01.09
62 года





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