|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.08.2008, 17:06 | #11 |
Участник клуба
Регистрация: 26.10.2007
Сообщений: 1,244
|
Может лучше както с БД попариться... 3 Гига "это вам не шубу в трусы заправять..."
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым, Попытка глубже понимать уже попахивает литром... |
10.08.2008, 13:02 | #12 | |
Пользователь
Регистрация: 20.06.2008
Сообщений: 95
|
Цитата:
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
|
|
02.09.2008, 17:39 | #13 |
Регистрация: 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. |
02.09.2008, 17:41 | #14 |
Регистрация: 07.08.2008
Сообщений: 5
|
Большое спасибо всем принимавшим участие!
Всё это тоже когданить пригодится.
|
02.09.2008, 22:03 | #15 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Алексей.
я рад, что у Вас все получилось. (хотя выбранный Вами метод далёк от того, что здесь предлагалось). но это Ваше дело. Просто попробуйте вставить две строчки в Ваш готовый код и потом замерить скорость. туда, где описываются переменные (например, где у вас описана переменная F: добавить: Код:
и дальше, вставить назначение буфера (вставить выделенную строчку!): Код:
удачи. |
03.09.2008, 10:49 | #16 |
Регистрация: 07.08.2008
Сообщений: 5
|
Serge_Bliznykov
Спасибо!
Я согласен, но некоторые вещи которые предлагались, интересные, но не совсем понимал в силу отсутствия опыта, знаний, с потоком тоже вышла своя "байда", сделал, запустил,...и комп повесился на 70%, не исключно что сделал что не то. Пришлось искать другие пути, хотя то что предлогалось более красиво, но это оказалось "грубо, дёшево, сердито". Но данные ответы для меня очень полезны. Ещё раз спасибо и за совет в том числе. Алексей. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск в файле | 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 |