• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Редактирование текстового файла в Pascal

  • Автор темы Автор темы Hayeng
  • Дата начала Дата начала

Hayeng

Новые
Регистрация
13 Фев 2011
Сообщения
14
Реакции
0
Баллы
0
Редактирование текстового файла в Pascal

Всем привет!
Скажу сразу, опыт программирования минимален и все давно забыто :tehnari_ru_942:
Возникла необходимость отредактировать файл txt большого размера (примерно 300 мб). Нужно из этого файла убрать строки, не содержащие некое слово (или наоборот, перенести строки с этим словом в новый текстовый файл). Вручную это не осилить.
Поэтому 3 вопроса:
1. Где лучше пытаться написать программу - в Pascal или Delphi, или это не важно?
2. Сможет ли написанная программа отредактировать такой большой текстовый файл?
3. Написание программы остановилось на этапе указания нужного текстового файла, а дальше не могу придумать.:tehnari_ru_325:
Помогите, плиз, хотя бы направление мыслей задайте...
 
Помогите, плиз, хотя бы направление мыслей задайте...
Нет уж, давайте лучше так: Вы выкладываете свои наработки, а мы Вам помогаем завершить сей титанический труд. Желательно иметь и сам файл, и конкретизацию отбора (если, конечно, не секрет).
 
К сожалению, файл я приложить не смогу, но сформировать аналогичный - не проблема.

Вот что получилось.
var
f: text;
s:='удаляемоеслово';
begin
assign(f,'test.txt');
reset(f);
while SeekEoln(f)=false do
begin
read(f,s);
а дальше не знаю как строку убрать, содержащую это слово.
Насколько я помню, там ведь нужно писать, чтобы строка удалялась и следующая строка вставала на ее место.
И вообще это реально сделать или мне не пытаться даже?
 
Как удалить строку я рано или поздно додумаюсь, а вот как создать новый файл - мыслей нет никаких.
 
Как удалить строку я рано или поздно додумаюсь, а вот как создать новый файл - мыслей нет никаких.
Да элементарно!
Вместо
f: text;
s:='удаляемоеслово';
begin
assign(f,'test.txt');
reset(f);
пишем
f,f1: text;
s:='удаляемоеслово';
begin
assign(f,'test.txt');
reset(f);
assign(f1,'test1.txt');
rewrite(f1);
Теперь программа создаст файл по имени test1.txt и откроет его для записи. Дальше алгоритм прост: если строка содержит слово, то просто читаем следующую в файле f, а если не содержит - записываем ее копию в файл f1.
В конце программы не забудьте обязательно закрыть оба файла командами Close(f) и Close(f1).
Кстати, лучше сам алгоритм сделать иначе: объявить строковую переменную (напр. Sx), в нее последовательно считывать строки исходного файла командой Readln(f,Sx) (НЕ read!!!), а уж потом анализировать строку на поиск слова.
 
:tehnari_ru_211: я с такой скоростью не выдаю программы.
Я сейчас пробовала написать так:
var
f,f1:text;
s:string; {слово в строке для переноса}
begin
assign (f, 'D:\file'); {исходный файл}
reset (f);
assign (f, 'D:\file'); {новый файл}
rewrite (f1);
write ('s=',); {введу слово}
readln (s);
if s:='слово' then ...
Понимаю, примитив, но я, к сожалению, не программист...
 
то есть хотела сделать так, чтобы слово воодить с клавиатуры, когда программа запросит...
 
:tehnari_ru_211: я с такой скоростью не выдаю программы.
Я сейчас пробовала написать так:
var
f,f1:text;
s:string; {слово в строке для переноса}
begin
assign (f, 'D:\file'); {исходный файл}
reset (f);
assign (f, 'D:\file'); {новый файл}
rewrite (f1);
write ('s=',); {введу слово}
readln (s);
if s:='слово' then ...
Понимаю, примитив, но я, к сожалению, не программист...
Стоп, стоп - уже сразу две грубейших ошибки:
1. Имена файлов должны быть РАЗНЫМИ.
2. В операторе Assign, который перед rewrite, файловая переменная должна быть f1, а не f.
Повнимательнее!

Ладно, сейчас нарисую, как это должно примерно выглядеть.
 
Ой, да, простите, это я опечаталась, второй параметр f1.
А еще скажите пожалуйста, если в текстовом файле в строках нет пробелов, это надо оговаривать в программе, или все равно?
 
Так, ну вот пожалуйста: один из возможных вариантов решения Вашей задачки. Вводите слово. Если строка исходного файла f содержит это слово (даже без пробелов, т.е. если просто встречается такая последовательность символов) - то строка отправляется в файл f2, а если не содержит - в файл f1. Таким образом, в файле f1 оказываются строки файла f, НЕ содержащие слово, а в файле f2 - содержащие:
Код:
VAR
 f,f1,f2:Text;
 S,Sx,Sy:String;
 i:Integer;
 b:boolean;
BEGIN
 Assign(f,'tst_in.txt');
 ReSet(f);
 Assign(f1,'tst_out1.txt');
 ReWrite(f1);
 Assign(f2,'tst_out2.txt');
 ReWrite(f2);
 WriteLn('Enter the word:');
 ReadLn(Sx);
 REPEAT
  ReadLn(f,S);
  b:=false;
  for i:=1 to Length(S)-Length(Sx) do
   if S[i]=Sx[1] then
    begin
     Sy:=Copy(S,i,Length(Sx));
     if Sx=Sy then b:=true;
    end;
  If b then
   WriteLn(f2,S)
  else
   WriteLn(f1,S);
 UNTIL EoF(f);
 Close(f);
 Close(f1);
 Close(f2);
END.
 
Получилось так:
program z1;
uses crt;
var f,f1:text;
s: string;
begin
assign (f, 'D:\Text1.txt');
reset(f);
assign (f1, 'D:\Text2.txt');
rewrite (f1);
while not eof (f) do
begin readln (f,s);
if (s[1]='слово') then
writeln(f1,s);
end;
Close(f);
close(f1);
end.
Программа ошибок не выдает, второй текстовый файл создает, но строки не переносит.
Что может быть не так?
 
Ой, спасибо огромное!
На мою позорную прогу не смотрите... :tehnari_ru_942:
 
Получилось так:
program z1;
uses crt;
var f,f1:text;
s: string;
begin
assign (f, 'D:\Text1.txt');
reset(f);
assign (f1, 'D:\Text2.txt');
rewrite (f1);
while not eof (f) do
begin readln (f,s);
if (s[1]='слово') then
writeln(f1,s);
end;
Close(f);
close(f1);
end.
Программа ошибок не выдает, второй текстовый файл создает, но строки не переносит.
Что может быть не так?
Много чего "не так".
Прежде всего, позвольте полюбопытствовать - а чем Вас предложенный мною вариант не устраивает? Уж он-то ошибок не содержит. Проверено, естественно.
Ну ладно, хотите по-своему - пожалуйста.
1. Ошибка здесь: if (s[1]='слово') then . Дело в том, что s[1] означает ПЕРВЫЙ СИМВОЛ строки s (например, если s='Hayeng', то s[1]='H'), и Вы пытаетесь этот первый символ сравнить с некоей строковой переменной 'слово'. Естественно, результат подобного сравнения будет всегда отрицательным.
2. Даже если Вы уберете [1], т.е. оставите if (s='слово') then , то получите решение не исходной, а сильно упрощенной задачи. В этом случае программа будет реагировать не на строки, СОДЕРЖАЩИЕ 'слово', а на строки, ЦЕЛИКОМ представляющие собой 'слово' и не содержащие ни одного другого символа.

Советую всё же попробовать разобраться с моим кодом - он содержит исчерпывающее решение задачи. Впрочем, дело Ваше.
 
Понятно, не все так просто.
За предложенный Вами вариант большое-пребольшое спасибо. Я увлеклась написанием своего "чуда" и не сразу заметила Ваше сообщение с программой )))
 
Ой, спасибо огромное!
На мою позорную прогу не смотрите... :tehnari_ru_942:
Да чего уж сразу "позорную"? Несколько, конечно, сыровато, но в принципе структура правильная. :)
 
Потому что программы не писала лет 7, а тут вот необходимость возникла. Тонкостей уже конечно не помню всех, потому и позорная )))
 
Подскажите пожалуйста, а если длина строки более 255 символов, можно ли заменить чем-нибудь string? Или нужно вводить массив?
Pchar не хочет работать с командой Readln.
 
Подскажите пожалуйста, а если длина строки более 255 символов, можно ли заменить чем-нибудь string? Или нужно вводить массив?
Pchar не хочет работать с командой Readln.
Ну вот и здрасьте - пошло-поехало! Pchar-то откуда вылез? Или Вам в Delphi программа нужна? Да еще с указателями непременно? Ну тогда это задача совсем другого уровня, которую решать надо совсем иначе.
Заменить-то String на Array of Char в принципе можно, только вот как быть с командой Copy? Даже и не знаю.
А откуда взялись строки с длиной больше 255 символов? ЧуднО...
 
Строки в текстовом файле оказались длиннее 255 символов. И поэтому программа все, что больше 255 символов в строке не воспринимала, и выборка была неполной. Не знаю вобщем, что делать.
А про Pchar вычитала в учебнике, еще был какой-то Antistring непонятный...
 
Назад
Сверху