Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2021, 07:36   #1
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию Удалить строки межлу словами

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,n,j : integer;
 List: Tstringlist;
begin
List:= TStringList.Create;
List.LoadFromFile('1.txt');
showmessage(list.Text);
for i:=0 to List.Count - 1 do
begin
if List.strings[i]='<!DOCTYPE html>' then  // нашли
begin
List.Delete(i);
while List.strings[i]<>'<div style="padding-top: 20px">' do List.Delete(i);  // пока ищем <3>  удаляем строчки
List.SaveToFile('1.txt');
     exit;

end;
end;
end;
Что не так?Пишет list index bound(0)
brownb вне форума Ответить с цитированием
Старый 08.09.2021, 08:18   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Delete в прямом цыкле, а не в обратном.
Запишите номера строк в массив и удаляет их в обратном порядке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 08.09.2021, 08:22   #3
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

Код:
 for i := 0 to List.Count - 1
 do if Pos('<div style="padding-top: 20px">', List.Strings[i]) <> 0
    then for j := i - 1 downto 0
         do if Pos('<!DOCTYPE html>', List.Strings[j]) <> 0
            then List.Delete(j);
list index bound(количество строк в тексте)

Цитата:
for i := 0 to List.Count - 1
do if Pos('<!DOCTYPE html>', List.Strings[i]) <> 0
then for j := i - 1 downto 0
do if Pos('<div style="padding-top: 20px">', List.Strings[j]) <> 0
then List.Delete(j);
Ошибок нет но не удаляет(

Последний раз редактировалось brownb; 08.09.2021 в 08:25.
brownb вне форума Ответить с цитированием
Старый 08.09.2021, 08:58   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Delete в прямом цыкле, а не в обратном.
Код:
for j:=List.Count-1 downto 0 do
https://programmersforum.ru/showpost...05&postcount=4
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.09.2021, 09:16   #5
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

Код:
Var i,j,n: Integer;
 List: Tstringlist;
begin
List:= TStringList.Create;
List.LoadFromFile('1.txt');
begin
 for i := 0 to List.Count - 1
 do if Pos('<!DOCTYPE html>', List.Strings[i]) <> 0 then  begin
showmessage(inttostr(i));
 for j := i to List.Count - 1 do
 if Pos('<div style="padding-top: 20px">', List.Strings[j]) <> 0 then  begin
 showmessage(inttostr(j));
 begin

for n:=List.Count-i downto j do  list.Delete(n);
Вообще врубится не могу!

Код:
begin
List:= TStringList.Create;
List1:= TStringList.Create;
List.LoadFromFile('1.txt');
begin
 for i := 0 to List.Count - 1
 do if Pos('<!DOCTYPE html>', List.Strings[i]) <> 0 then  begin
 for j := i to List.Count - 1 do
 if Pos('<div style="padding-top: 20px">', List.Strings[j]) <> 0 then  begin
for n:=List.Count-1 downto j do
begin
list.Delete(n);
showmessage(list.Text)
end;
неработает

Последний раз редактировалось BDA; 08.09.2021 в 19:17.
brownb вне форума Ответить с цитированием
Старый 08.09.2021, 11:06   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

если вы что-то удалили, то число строк изменилось.
и ЛЮБОЙ цикл for ... to List.count-1 не будет работать.
Цитата:
Код:
for i := 0 to List.Count - 1
1. найти место (индекс) строки '<!DOCTYPE html>' и закончить ЦИКЛ такого поиска.
2. начиная с конца и вплоть до найденого в п.1 места удалять строки удовлетворяющие условию '<div style... '

P.S. переменная цикла ВНЕ цикла имеет непредсказуемое значение. ==>искомое значение индекса(п.1) надо запоминать в какой-либо "независимой" переменной.
P.P.S. да еще желательно обеспечить ей(этой переменной) какое-то значение на случай если искомая строка не будет найдена.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.09.2021 в 11:14.
evg_m вне форума Ответить с цитированием
Старый 08.09.2021, 18:41   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию

А может лучше делать через while?

У меня в программе вот так сделано:

Код:
procedure TForm4.Button4Click(Sender: TObject);
var
 i:longint;
begin
 i:=0;
 while i<memo1.Lines.Count do begin
  If memo1.Lines[i]='' then memo1.Lines.Delete(i)
  else inc(i);
 end;
end;
И на каждой итерации или увеличиваем счетчик, или удаляем строку

Последний раз редактировалось BDA; 08.09.2021 в 19:16.
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как удалить пробелы в файле между двумя словами тегами? vitalyoleg Общие вопросы C/C++ 1 25.10.2018 17:39
Из строки удалить среднюю букву, если длина строки нечетная, если четная удалить две средние буквы. Заменить все вхождения в текст некоторой буквы на другую букву(PascalABCNET) FlayGlam Помощь студентам 0 03.12.2016 09:57
Вставить строки над заданными словами Serega_1 Microsoft Office Word 0 04.11.2014 18:02
Дана строка со словами, разделёнными пробелами, в конце - точка. Удалить слово с заданным номером (Паскаль ABC) Margosham-k Помощь студентам 6 10.04.2012 12:11
удалить лишние пробелы со строки так чтобы между словами осталось по одному пробелу java llRom4ikll Общие вопросы по Java, Java SE, Kotlin 2 12.04.2010 19:35