ВОПРОС · Q&A

Перебор Файлов В Папке И Последующий Поиск

8 ответов 5,2 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор вопроса
Здравствуйте!
Нужно написать программу, которая будет открывать по очереди каждый файл(файлы имеют разные названия) в определенной папке и искать в ней слова(например:после name до f выписать слово). Файлы все в формате txt.
Вот я попробовал кое-что написать, но заступорился: Код на Паскаль

program go;
Uses DOS;
var
S: SearchRec;
begin
FindFirst('C:\marcom\proba\*.txt',AnyFile,S);{открываем файлы по очереди}
while DosError = 0 do
with S do
Reset(s); {открываем файл}
While not eof(f1) do {читаем файл до конца}
{как здесь организовать поиск слова, который находится от <title> до</title>}
{дальше переходим к другому файлу}
FindNext(S)

end.

Заранее спасибо
 
Здравствуйте!
Reset(s); {открываем файл}

Reset не открывает файл а перематывает его для чтения. открывают файл Assign или AssignFile
если вы хотите обрабатывать информацию внутри прочитайте ее сначала например методом Read или ReadFile
и не забудте закрыть файл после обработки.

Вобщем смотрите хелп.
 
Сейчас попробую доработать
 
Вот я попытался доработать, но одна проблема все-таки осталась. у меня не получается сделать чтобы он перебирал файлы в папке, а только вводить вручную, можете помочь пожалуйста?

<!--shcode--><pre><code class='pascal'>uses crt;
const
n=123;
var
ch:char;
s:string[n];
i:integer;
f:text;

Procedure findText;
begin
reset(f);
repeat
s:='';
for i:=1 to (n-1) do
begin
read(f,ch);
s:=ch;
end;
repeat
read(f,ch);
s[n]:=ch;
for i:=1 to n do begin
s:=s+s;
end;
if s='<div class="labeled fl_l"><a href="/search?c[name]=0&c[section]=people&c[politic]=9" onclick="return nav.go(this, event);">' then
begin
write(' ');
break;
end;
for i:=2 to n do
begin
s[i-1]:=s;
end;
until eof(f);
BEGIN
repeat
if eof(f)=true then begin
break;
end;
read(f,ch);
if ch='<' then
begin
writeln;
readln(f);
break;
end;
write(ch);
until eof(f);
END;
until eof(f);
close(f);
end;

Begin
clrscr;
assign(f,'C:\12.txt');
findText;
assign(f,'C:\22.txt');
findText;
assign(f,'C:\33.txt');
findText;
assign(f,'C:\44.txt');
findText;
assign(f,'C:\55.txt');
findText;
readkey;
end.[/CODE]
 
да замени assign(f,...); на связывание файловой переменной f через assign с именем найденного файла.
Т.е. в первоначальном примере убери "Reset(s); {открываем файл}" и добавь связывание файловой переменной с именем файла (с SR.Name, возможно, еще и путь надо добавить, не помню) и потом уже вызывай findText
 
Не понял, а как добавить связывание с переменной? Я пробовал через FinfFirst, но вот все никак.
 
примерно так:
Код:
var
S: SearchRec;
f:text;
begin
FindFirst('C:\marcom\proba\*.txt',AnyFile,S);
while DosError = 0 do
begin
assign(f, 'C:\marcom\proba\' + s.Name); {связываем с найденным файлом}
findText;
FindNext(S)
end;
end.
 
У меня возникла такая проблема. Чтобы работать с функцией FindFirst надо подключить модуль WinDos, когда я ввожу его в pascal abc он пишет, что модуль не найден. Моя программа в TP7 отказывается работать, пишет, что file not found и показывает на строку reset(f), что делать не знаю...
 
А вот так можно? Я посмотрел, dos на abc - utils, но при запуске пишет неизвестный идентификатор FileFirst. Почему?

Код:
uses crt,utils;
const
n=123;
var
ch:char;
s:string[n];
i:integer;
f:text;
DirInfo : SearchRec;
FileMask : String;
FilePath : String;
FileName : String;

Procedure findText;
begin
reset(f);
repeat
s:='';
for i:=1 to (n-1) do
begin
read(f,ch);
s[i]:=ch;
end;
repeat
read(f,ch);
s[n]:=ch;
for i:=1 to n do begin
s:=s+s[i];
end;
if s='<div class="labeled fl_l"><a href="/search?c[name]=0&c[section]=people&c[politic]=9" onclick="return nav.go(this, event);">' then
begin
write(' ');
break;
end;
for i:=2 to n do
begin
s[i-1]:=s[i];
end;
until eof(f);
BEGIN
repeat
if eof(f)=true then begin
break;
end;
read(f,ch);
if ch='<' then
begin
writeln;
readln(f);
break;
end;
write(ch);
until eof(f);
END;
until eof(f);
close(f);
end;

Begin
clrscr;

FilePath:='C:\Users\marcom\proba\';
FileMask:='*.txt';
FindFirst(FilePath+FileMask, Archive, DirInfo);
While DosError = 0 Do
Begin
FileName:=FilePath+DirInfo.Name; 
assign(f,FileName);
findText;
FindNext(DirInfo);
End;
WriteLn('Press any key...');
readkey;
end.
 
Статус
Закрыто для дальнейших ответов.