Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2008, 17:06   #11
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Может лучше както с БД попариться... 3 Гига "это вам не шубу в трусы заправять..."
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 10.08.2008, 13:02   #12
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
В 1.4Гб-файле нашёл строку в конце ~за 80 секунд (WinHEX - около минуты), скопипастил с http://articles.org.ru/cn/showdetail.php?cid=6427
Попробовал на файлах маленькой длинны (порядка нескольких КБ) и получил вкорне неверный результат (скорее всего косяки с размером буфера), поэтому привожу свой вариант. Для считывания кусков файла в буфер использовалась функция BlockRead(). Размер буфера задается константой buf_size. Для больших файлов желательно устанавливать размер буфера побольше .
Вложения
Тип файла: rar Find_in_Files.rar (177.2 Кб, 30 просмотров)
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 02.09.2008, 17:39   #13
Алексей_M
 
Регистрация: 07.08.2008
Сообщений: 5
Хорошо СДЕЛАЛ!!!!

Должен сказать, в решении помогал товарищ. Всё оказалось на много проще. Ищет по 1 или нескольким критериям с разделением "//", регист вводимой строки не важен, поиск в 2.4 Gb файле ~ 4 мин. (таймер не делал, засекал на часах), открытие файла есно необязательно через Combobox (сделано для случае массы логов в папке, удобство выбора ).

procedure TMainForm.Button4Click(Sender: TObject);
begin
Button5.Tag:=0;
if ((ComboBox1.Text='') or not(fileexists(Path + ComboBox1.Text))) then exit;
//проверяем есть ли файл с именем из списка
AssignFile(F, Path + ComboBox1.Text); //связываем файловую переменную с именем файла
Reset(F); //открываем файл
l:=0; //сбрасываем счетчики
c:=0;
m:=''; t:=''; //очищаем строковые переменные
Memo1.Clear; //очищаем Мемо
sign:=false; //сбрасываем признак продолжения строки
label4.Caption:=IntToStr(l);
label6.Caption:=IntToStr(c);
while not eof(F) do //читаем построчно из файла, пока не дойдем до конца
begin //это и есть обработка файла
if length(t)=0 then
begin
readln(F, t); //если строковая переменная пустая, прочитали строку в строковую переменную
inc(l); //увеличили счетчик прочитанных строк
label4.Caption:=IntToStr(l);
end;
n:=pos('ISO', t);
if ((n=0) and not(sign)) //если в строке нет фрагмента 'ISO' и 'ISO' не открыто,
then
begin
t:=''; // то отбрасываем прочитанную строку
continue; //и читаем следующую
end;
if ((n=0) and sign) then m:=m+t; //если 'ISO' открыто и нет 'ISO'
if ((n>0) and not(sign)) then //если 'ISO' не открыто и встретилось 'ISO'
begin
if n>1 then delete(t, 1, n-1); //отрезаем начало строки до 'ISO'
ts:=t;
delete(ts, 1, 3);
n:=pos('ISO',ts);
if n>0
then
begin
s:='ISO'+copy(ts, 1, n);
delete(ts, 1, n-1);
t:=ts;
end
else
begin
s:='ISO'+ts;
t:='';
end;
m:=s;
sign:=true; //устанавливаем признак открытого 'ISO'
continue;
end;
if ((n>0) and sign) then //если 'ISO' открыто и встретилось 'ISO'
begin //то закрываем строку
sign:=false; //сбросим признак продолжения
if n=1 //если 'ISO' в начале строки
then
begin
while n=1 do //отрезаем по три первых знака в строке, пока там 'ISO'
begin
delete(t,1,3);
n:=pos('ISO', t);
end;
if n=0
then
begin
m:=m+t;
t:='';
end
else
begin
s:=copy(t, 1, n-1); //то вырезаем из нее все до 'ISO'
m:=m+s; //и прибавляем вырезанное к собранной строке
delete(t, 1, n-1); //после этого оставляем в прочитанной строке только информацию после 'ISO'
end;
end;
end; //конец обработки строки. Iso пойдет в следующую строку,
//а собранная строка - на анализ наличия фрагментов
s:=AnsiUpperCase(Edit1.Text);
finded:=true;
while (finded and (length(s)>0)) do
begin
n:=pos('//', s);
if n>0 then
begin
ts:=copy(s, 1, n-1);
delete(s, 1, n+1);
end
else
begin
ts:=s;
s:='';
end;
if pos(ts, m)=0 then finded:=false;
end; //конец анализа собранной строки
if finded then
begin
m:=m+' -<<<END DATA';
Memo1.Lines.Add(m); //то добавить ее в Мемо
Memo1.Lines.Add('');
inc(c); //увеличить счетчик найденных фрагментов
label6.Caption:=IntToStr(c);
end;
m:='';
application.ProcessMessages;
if Button5.tag<>0 then break;
end;
CloseFile(F); //закрываем файловую переменную
end;
procedure TMainForm.Button5Click(Sender: TObject);
begin
Button5.Tag:=1;
end;
end.
Алексей_M вне форума Ответить с цитированием
Старый 02.09.2008, 17:41   #14
Алексей_M
 
Регистрация: 07.08.2008
Сообщений: 5
Радость Большое спасибо всем принимавшим участие!

Всё это тоже когданить пригодится.
Алексей_M вне форума Ответить с цитированием
Старый 02.09.2008, 22:03   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Алексей.
я рад, что у Вас все получилось.
(хотя выбранный Вами метод далёк от того, что здесь предлагалось). но это Ваше дело.
Просто попробуйте вставить две строчки в Ваш готовый код и потом замерить скорость.
туда, где описываются переменные (например, где у вас описана переменная F:
добавить:
Код:
 Buf: array[1..1024*16] of Char;
вместо *16 можно попробовать другие числа (*4 или *8 или *32 ...) - это задание буфера чтения данных.
и дальше, вставить назначение буфера (вставить выделенную строчку!):
Код:
AssignFile(F, Path + ComboBox1.Text); //связываем файловую переменную с именем файла
System.SetTextBuf(F, Buf);
Reset(F); //открываем файл
Если я не ошибаюсь, то это может в несколько раз увеличить скорость работы Вашей программки...

удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.09.2008, 10:49   #16
Алексей_M
 
Регистрация: 07.08.2008
Сообщений: 5
Радость Serge_Bliznykov

Спасибо!
Я согласен, но некоторые вещи которые предлагались, интересные, но не совсем понимал в силу отсутствия опыта, знаний, с потоком тоже вышла своя "байда", сделал, запустил,...и комп повесился на 70%, не исключно что сделал что не то. Пришлось искать другие пути, хотя то что предлогалось более красиво, но это оказалось "грубо, дёшево, сердито". Но данные ответы для меня очень полезны.
Ещё раз спасибо и за совет в том числе.
Алексей.
Алексей_M вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в файле Zandrey Microsoft Office Excel 8 05.09.2008 12:23
поиск в файле Elm0 Паскаль, Turbo Pascal, PascalABC.NET 14 07.06.2008 22:41
Поиск в файле lin Помощь студентам 3 25.05.2007 08:40
Поиск в файле asale Microsoft Office Excel 1 15.05.2007 23:33