Консультация № 172967
06.10.2009, 12:04
0.00 руб.
0 10 1
Здравствуйте. Помогите решить "задачку"...
В коде не получается сделать, чтобы найденные данные (строки) записывались в новый файл. Т.е. необходимо правильно записать POS. Файл создается, но пустой, хотя строки такие в тексте встречаются.

Приложение:
procedure TForm1.Button1Click(Sender: TObject);
var
f:file;
buf:array[0..16384] of char;
s:string;
bl,i,j,k:integer;
p:longint;
temp:TStringList;
begin
s:=edStr.Text;
if not OpenDialog1.Execute then Exit;
AssignFile(f,Form1.OpenDialog1.FileName);
try
Reset(f,1);
temp:=TStringList.Create;
except
ShowMessage('Невозможно открыть "'+OpenDialog1.FileName+'"!');
Exit;
end;

i:=1;
bl:=16384;

while (not EOF(f))and(i<=length(s)) do
begin
Application.ProcessMessages;
if (FilePos(f)+bl)>FileSize(f) then
bl:=1;
buf:='';
BlockRead(f,buf,bl);
Label2.Caption:=IntToStr(trunc(FilePos(f)/FileSize(f)*100))+'%';
j:=0;

repeat
if buf[j]=s[i] then
begin
if i=1 then
p:=FilePos(f)-bl+j;
k:=j+1;
inc(i);
while (k<bl)and(i>1)and(i<=length(s)) do
begin
if buf[k]=s[i] then
inc(i)
else
i:=1;
inc(k);
end;
end
else
i:=1;
inc(j);
until (i>length(s))or(i>1)or(j=bl);
end;
if (Pos('реферат', s) <> 0) and (temp.IndexOf(s) = -1)
then temp.Add(s);
temp.SaveToFile('1.txt');
CloseFile(f);

end;
end.

Обсуждение

давно
Мастер-Эксперт
425
4118
06.10.2009, 12:25
общий
warafa:
Может быть у Вас не получается найти требуемые строки?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
06.10.2009, 15:17
общий
Верно. У меня не получается найти строки. Не правильно сформулировал.
давно
Мастер-Эксперт
425
4118
06.10.2009, 17:08
общий
warafa:
По какому принципу (или каким образом) задаётся строка, которая ищется в файле?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
06.10.2009, 18:10
общий
в принципе вот исходник: _http://narod.ru/disk/13877697000/Find_in_Files.rar.html

задается слово, по которому ищем. или нет?
мне просто нужно чтобы из этого кода сделать поиск строки с нужным словом с помощью POS.
извините, но познаний у меня еще маловато (
давно
Мастер-Эксперт
425
4118
06.10.2009, 18:39
общий
warafa:
Насколько я понял, строка, которую мы должны искать, задаётся в edstr.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
06.10.2009, 18:41
общий
это ответ
Здравствуйте, warafa.

Функция Pos() ищет подстроку в строке и если находит, возвращает позицию первого символа в строке.
Вот смотрите, текстовый файл можно довольно просто загрузить в StringList. Далее, просматриваем каждую строку этого самого StringList и функцией Pos() проверяем, содержится ли заданная в edstr подстрока или нет. Если да, то заносим текущую строку из первого StringList во второй. Как только просмотрели весь первый StringList, сбрасываем второй StringList в файл на диск:
Код:
Var
st1, st2: TSringList;
i: Integer;
Begin
st1:=TStringList.Create;
st2:=TStringList.Create;

If OpenDialog1.Execute Then //Запрашиваем имя файла
Begin
st1.LoadFromFile(OpenDialog1.FileName); //Открываем файл, загружаем его в первый StringList
For i:=0 To st1.Count-1 Do //Просматриваем его с первой по последнюю строку
If Pos(edstr.Text, st1[i])>0 Then //Если заданная строка найдена
st2.Add(st1[i]); //Загружаем ее во второй StringList
st2.SaveToFile('Result.txt'); //Сохраняем результат из второго StringList'а в файл
End;
st1.Free;
st2.Free;
End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
06.10.2009, 18:44
общий
warafa:
Добавлю ещё, что предложенный код ищет только точное соответствие искомой подстроки в строке файла.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
06.10.2009, 21:08
общий
да. но ваш код не будет работать с файлом большого размера - мешает TStringList.
а первоначальный код - как раз для работы с файлами > 700 Мб
и в edstr можно задать только одно слово, а если мне нужно два и более? создать условие - 'реферат' и 'списанный'.
давно
Мастер-Эксперт
425
4118
07.10.2009, 04:58
общий
warafa:
да. но ваш код не будет работать с файлом большого размера - мешает TStringList.
а первоначальный код - как раз для работы с файлами > 700 Мб

Вот смотрите что у нас с Вами получается. После каждого моего решения Вы будете предъявлять новое условие, которое полностью это решение аннулирует. Как Вы думаете, с таким подходом мы сможем решить Вашу проблему?
и в edstr можно задать только одно слово, а если мне нужно два и более? создать условие - 'реферат' и 'списанный'.

Попробуйте всё же формулировать условие так, чтобы оно приводило к какому-то решению. Вы ведь прекрасно знаете, что правильно сформулированный вопрос - это 50% ответа.
Эти два слова пишутся подряд, т.е. составляют словосочетание, которое собственно и ищется или это два разных слова, которые расположены в строке поиска по отдельности друг от друга, но должны непременно присутствовать, хоть и в разных местах строки?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
07.10.2009, 05:59
общий
warafa:
Добавлю. Функция Pos - это не панацея и не готовый алгоритм, это только оболочка над разбором строки с прямым поиском первого вхождения искомого набора символов ('абв', 'маш', ' ') используется как правило для нахождения символа в слове. Вы же говорите о полнотекстовом поиске, это несколько иное и сложность чуть больше - это алгоритм, который требует хорошего продумывания и уж точно в нем будет использованы многие функции в том числе возможно и Pos.. (кстати, от слова Position - положение, позиция)
Форма ответа