Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2008, 20:28
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Вопрос Помогите с алгоритмом...

Напишите пожалуйста алгоритм проверки строки в файле, желательно методом TFileStream.
Вот как я записываю(из Delphi World)
Код:
procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
  fs: TFileStream;
  S: string;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
    SetLength(S, fs.Size);
    fs.ReadBuffer(S[1], fs.Size);
  finally
    fs.Free;
  end;
  S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
  fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.WriteBuffer(S[1], Length(S));
  finally
    fs.Free;
  end;
end;
помогите пожалуйста как мне написать проверку на существование строки в файле
Ответить с цитированием
  #2  
Старый 14.01.2008, 22:04
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Посмотри здесь: http://www.delphisources.ru/pages/faq/file_system.html
аздел Файлы (в конце раздела (Чтения файлов))!
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 15.01.2008, 15:47
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Печаль

Это я читал в Delphi World, но вроде там нет ничего для проверки строки
Ответить с цитированием
  #4  
Старый 15.01.2008, 18:02
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Ну как же!???
Читаешь строку а потом проверяшь ее на соответствие нужной тебе строке.
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #5  
Старый 15.01.2008, 18:09
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Смех

Приведи пожалуйста код, а то значит я что-то не туда смотрел.
Ответить с цитированием
  #6  
Старый 16.01.2008, 11:02
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Да че тут париться. TFileStream какие - то придумали.

Код:
function StrExists(FileName,FindStr:string):boolean;
var
Str:string;
begin
AssignFile(input,FileName);
Reset(input);
 while not eof(input) do begin
  Readln(str);
  if Pos(FindStr,Str)>0 then begin
   Result:=true;
   CloseFile(input);
   exit;
  end;
 end;
CloseFile(input);
Result:=false;
end;
Ответить с цитированием
  #7  
Старый 16.01.2008, 12:37
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Хорошо

Спасибо, будет время попробую
Ответить с цитированием
  #8  
Старый 16.01.2008, 16:16
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Лампочка Помогите....

А как можно сделать, чтобы этот код работал быстрее, а то около 300 файлов по 60 вариантов в каждом файле нужно проверить, а работает очень медленно............
Помогите как сделать быстрее ?
Даже в 1 файле по 60 проверок не знаю сколько будет длиться, т.к. идет до сих пор....

Последний раз редактировалось Oleg, 16.01.2008 в 16:21.
Ответить с цитированием
  #9  
Старый 16.01.2008, 16:46
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Можно так:

Код:
procedure FindStringInFile(const FileName, searchstring: string);
var
  fs: TFileStream;
  S: string;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
    SetLength(S, fs.Size);
    fs.ReadBuffer(S[1], fs.Size);
  finally
    fs.Free;
  end;
  if Pos(searchstring,S) > 0 then ShowMessage('Есть!') else ShowMessage('Нет...');
end;

PS: Работает быстро, проверял: поиск строки в файле 23 Мб занял < 1 сек
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887

Последний раз редактировалось Rokuell, 16.01.2008 в 16:57.
Ответить с цитированием
  #10  
Старый 16.01.2008, 17:29
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Не знаю как ты используешь мою функцию , у меня 26 мб обрабатывается за 0,566 сек
Ответить с цитированием
  #11  
Старый 16.01.2008, 17:34
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Смех Вот:

Вот как использую:
Код:
for i:=0 to scrG.Count-1 do // число файлов
for j:=0 to 60 do begin       // для каждого файла проверка и если есть, то
cmd:='test_'+IntToStr(j);   // заносим в ListBox
if StrExists(Edit2.Text+'/'+scrG.Items[i],cmd) = true then
nav.Items.Add(cmd);
Или не так использую
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
  #12  
Старый 16.01.2008, 17:50
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Естественно! Так любой поиск 2 дня работать будет. Ты со своим циклом j многомегабайтный файл 60 раз будешь открывать, вместо этого используй массив.
Ответить с цитированием
  #13  
Старый 16.01.2008, 17:57
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Восклицание

>ART
Работает медленно, т.к у тебя в алгоритме идёт построчное считывание и => функция Pos вызывается столько раз, сколько строк в файле!
В данном случае читать файл надо одной строкой и искать лишь один раз вызвав Pos
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #14  
Старый 16.01.2008, 17:57
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

>Oleg
А кокого размера у тебя файлы?
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887

Последний раз редактировалось Rokuell, 16.01.2008 в 18:00.
Ответить с цитированием
  #15  
Старый 16.01.2008, 18:00
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
По умолчанию

Цитата:
Сообщение от Rokuell
>В данном случае читать файл надо одной строкой и искать лишь один раз вызвав Pos
А как читать одной строкой и т.д. ?
Размер от 2kb - 200 kb
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей

Последний раз редактировалось Oleg, 16.01.2008 в 18:07.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter