Просмотр полной версии : Удаление пустых строк
У меня очень простой вопрос:
Как удалить пустые строки и строки состоящие только из пробелов из memo1?
Я пробовал 2 варианта:
1. вариант (более эффективный)
i:= 0; While i <> Memo1.Lines.Count - 1 do begin if Length(Memo1.Lines.Strings[i])=0 then begin Memo1.Lines.Delete(i); dec(i); end; inc(i); Next; end;
Но все равно в середине или еще где то остается пара пустых строк и строки состоящие из пробелов тоже остаются.
Это АНТИВАРИАНТ. Проблема не решена!
2. вариант. (Ваще не эффективный)
for i:=0 to memo1.lines.count-1 do if memo1.lines.strings[i]='' then memo1.lines.delete(i);
Не нужных строк остается гораздо больше.
Я долго немог найти ответ в Гугле. Но истина где то рядом...
Я думаю должно быть простое и гениальное решение для этой НЕВЕРОЯТНО трудно задачи! :confused:
Попробуй так:
for i:=memo1.lines.count-1 downto 0 do
begin
if memo1.lines.strings[i]='' then
memo1.lines.delete(i);
end;
crystalbit
04.06.2010, 21:08
используй trim(Memo1.Lines.Strings[i]) вместо Memo1.Lines.Strings[i] в условиях.
во втором варианте цикл неверный, количество меняется при удалении строки. верно будет for i:=memo1.lines.count-1 downto 0 do
тему научись сначало правильно называть, затем хоть почитай доку по делфи, и тока потом называй это НЕВЕРОЯТНО трудной задачей.
тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно
SL: TStringList;
function CheckPattern(s: string; c: char): boolean;
begin
Result:=true;
for i:=1 to Length(s) do
if s[i]<>c then begin Result:=false; break; end; // если не пробел то строка не валидная
end;
SL:=TStringList.Create;
for i:=0 to SL.Count-1 do
if (Length(SL.Strings[i])=0) or (CheckPattern(SL.Strings[i], #32)) then SL.Delete(i);
SL.Free;
Должно все работать)
Как удалить пустые строки и строки состоящие только из пробелов из memo1?
procedure TForm1.Button1Click(Sender: TObject);
var
i, i2, schetchik: integer;
current_str: string;
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
schetchik:=0;
if memo1.lines.strings[i]='' then
begin
memo1.lines.delete(i);
end;
for i2:=1 to length(Memo1.Lines.Strings[i]) do
begin
current_str:=Memo1.Lines.Strings[i];
if current_str[i2]=' ' then inc(schetchik);
if schetchik=length(Memo1.Lines.Strings[i]) then memo1.lines.delete(i);
end;
end;
end;
GhostOnline
04.06.2010, 21:48
Пустая строка в мемо это на самом деле #13#10, т.е. как бы не совсем пустая
procedure TForm1.Button1Click(Sender: TObject);
var
i, i2, schetchik: integer;
current_str: string;
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
schetchik:=0;
if memo1.lines.strings[i]='' then
begin
memo1.lines.delete(i);
end;
for i2:=1 to length(Memo1.Lines.Strings[i]) do
begin
current_str:=Memo1.Lines.Strings[i];
if current_str[i2]=' ' then inc(schetchik);
if schetchik=length(Memo1.Lines.Strings[i]) then memo1.lines.delete(i);
end;
end;
end;
Проверил - это АНТИВАРИАНТ. :(
После первого нажатия на кнопку - почти ничо не удаляет.
Нажимаю 2,3,4,5 раз - более менее что то удалило, но все же остаются строки из пробелов.
Решение не найдено.
Попробуй так:
for i:=memo1.lines.count-1 downto 0 do
begin
if memo1.lines.strings[i]='' then
memo1.lines.delete(i);
end;
Проверил - тоже не работает.
Остаются и пустые строки и строки из пробелов. :(
SL: TStringList;
function CheckPattern(s: string; c: char): boolean;
begin
Result:=true;
for i:=1 to Length(s) do
if s[i]<>c then begin Result:=false; break; end; // если не пробел то строка не валидная
end;
SL:=TStringList.Create;
for i:=0 to SL.Count-1 do
if (Length(SL.Strings[i])=0) or (CheckPattern(SL.Strings[i], #32)) then SL.Delete(i);
SL.Free;
Должно все работать)
Проверил. Не работает. Остаются и пустые строки и строки из пробелов. :(
тему научись сначало правильно называть, затем хоть почитай доку по делфи, и тока потом называй это НЕВЕРОЯТНО трудной задачей.
тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно
тему научись сначало правильно называть
Тема названа так - потому что это действительно не простая задача, как оказалось - ни один из предложенных вариантов пользователями этого форума не сработал.
затем хоть почитай доку по делфи
Я дофига прочитал, а нормального удаления пустых строк и строк состоящих из пробелов не нашел. Все методы не дают достаточного результата.
Если знаеш учебник, который я пропустил - ткни пальцем. Буду очень благодарен.
тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно
На словах то каждый тут просто гений, а реально работающий код никто не может предложить. Не ужели эта задача нерешаема? :confused:
Может у тебя проблема в том, что в Memo1 находится не только пробелы и пустые строки или табуляторы а еще какая нить непечатная фигня? И ты по этому поводу мозги угукаешь людям.
var
x : integer;
begin
for x := Memo1.Lines.Count - 1 downto 0 do
begin
if trim(Memo1.Lines.Strings[x]) = '' then Memo1.Lines.Delete(x);
end;
end;
Отлично удаляет пустые строки, строки состоящие из пробелов, строки состоящие из табуляторов и строки состоящие из табов и пробелов.
AquaKlaster
05.06.2010, 09:18
var
I: Integer;
begin
for I := 0 to Memo1.Lines.Count - 1 do
begin
if (Memo1.Lines[I] <> '') and (Trim(Memo1.Lines[I]) <> '') then
Memo2.Lines.Add(Memo1.Lines[I]);
end;
end;
Может у тебя проблема в том, что в Memo1 находится не только пробелы и пустые строки или табуляторы а еще какая нить непечатная фигня? И ты по этому поводу мозги угукаешь людям
HTML код в мемо находится. А точнее - форма подписки на рассылку.
Вот например:
<DIV align="center"><P style="font-family:
Verdana; font-size:11px; text-
indent:0px"><STRONG><FONT
color="#cc0000" size="4"
face="Verdana">Хотите бесплатно получать 2
-3 видеоурока каждый месяц?
</FONT></STRONG></P></DIV>
<TABLE width="477" height="230" border="0"
align="center">
<TBODY><TR> <TD
width="36%"
rowspan="8" align="center" valign="top"><DIV
class="widget">
<FORM
name="SR_form" method="post" target="_blank"
action="http://smartresponder.ru/subscribe.html"
onsubmit="return SR_submit(this)">
<INPUT type="hidden"
name="version" value="1">
<INPUT type="hidden" name="tid"
value="34769">
<INPUT type="hidden" name="uid"
value="27025">
<INPUT type="hidden" name="charset"
value="windows-1251">
<INPUT type="hidden" name="lang" value="1">
<INPUT type="hidden" name="did[]"
value="9267">
<P style="font-family: Verdana,sans-
serif; margin:0px; padding:0px; color: #000000;
font-size: 11px; font-weight: normal; text-
indent:0px"> Ваше имя на русском:
<INPUT type="text"
name="field_name_first" size="23" value=""
maxlength="50" style="border: 1px #c1c1c1
solid; font-family: Verdana; font-size: 11px;
width:140; color:#424242;"></P>
<P style="font-family: Verdana,sans-
serif; margin:0px; padding:0px; color: #000000;
font-size: 11px; font-weight: normal; text-
indent:0px"> Ваш Email адрес:
<INPUT type="text"
name="field_email" size="23" value=""
maxlength="50" style="margin:0px; padding:0px;
border: 1px #c1c1c1 solid; font-family: Verdana;
font-size: 11px; width:140; color:#424242;"></P>
<P style="margin:5px;margin-
top:10px; padding:0px; text-indent:0px">
<INPUT type="submit"
name="SR_submitButton" value="Да, хочу"
style=" font-family: Verdana, sans-serif; border:1px
gray solid; font-size: 11px; width:140px;
height:20px; background-Color:#f6f6f6;
background-image: url(img/button2.gif);
color:#000000; font-weight:bold;">
</P>
</FORM>
</DIV>
<P style="font-family: Verdana; font-size:11px;
text-indent:0px"><STRONG>Вводите данные в
форму и жмите по кнопке "Да,
хочу".</STRONG></P>
<P style="font-family: Verdana; font-size:11px;
text-indent:0px"><FONT
color="#cc0000">Приватность Ваших данных
гарантируется.</FONT></P>
</TD>
<TD width="64%"><P
class="ds"><FONT color="#0500CC">+
<STRONG>Свежие
скрипты</STRONG></FONT></P></TD>
</TR>
<TR>
<TD><P
class="ds"><FONT color="#0ECC00">
<STRONG>+ Свежие
статьи</STRONG></FONT></P></TD>
</TR>
<TR>
<TD><P
class="ds"><FONT color="#cc0000">+
<STRONG>Свежие
программы</STRONG></FONT></P></TD>
</TR>
<TR>
<TD><P class="ds">
+ Конкурсы с
денежными призами</P></TD>
</TR>
<TR>
<TD><P class="ds">
+ <STRONG>100% авторский
материал</STRONG></P></TD>
</TR>
<TR>
<TD><P class="ds">
+ Более 60000
читателей</P></TD>
</TR>
<TR>
<TD><P class="ds">
+ Более 100
положительных отзывов</P></TD>
</TR>
<TR>
<TD><P
class="ds"></P></TD>
</TR>
</TBODY></TABLE></TD></TR></TBODY></
TABLE></TD></TR></TBODY></TABLE></TD
></TR></TBODY>
____________________________________________
Вот отсюда нужно удалить лишние строки. Какие еще непечатные символы тут могут быть??? :confused:
AquaKlaster
05.06.2010, 09:26
Кидай такой длинный текст в тег CODE
народ, вы не забывайте что проход должен быть с конца списка а не с начала, потому что строки сдвигаются и тогда будут пропуски.
AquaKlaster
05.06.2010, 09:27
var
I: Integer;
begin
I := 0;
while Memo1.Lines.Count <> I do
begin
if (Memo1.Lines[I] <> '') and (Trim(Memo1.Lines[I]) <> '') then
Inc(I)
else
Memo1.Lines.Delete(I);
end;
end;
Данный код убрал пробелы и пустые строки с твоего HTML
var
I: Integer;
begin
for I := 0 to Memo1.Lines.Count - 1 do
begin
if (Memo1.Lines[I] <> '') and (Trim(Memo1.Lines[I]) <> '') then
Memo2.Lines.Add(Memo1.Lines[I]);
end;
end;
Чувак!!!! ты гений!! Невероятно, но это сработало! :D
Спасибо большое!
AquaKlaster
05.06.2010, 09:29
Чувак!!!! ты гений!! Невероятно, но это сработало! :D
Спасибо большое!
Советую юзать мой второй код, он работает с 1 memo!
Кидай такой длинный текст в тег CODE
Ваш этот тег убирает как раз ненужные строки))). (Когда вставляеш)
Dimon32, какбы сказать, это извращенческий метод юзать второй список.
Мой код тоже нормально всё обработал и вывел без пустых строк.
Советую юзать мой второй код, он работает с 1 memo!
Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(
Советую юзать мой второй код, он работает с 1 memo!
Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(
Dimon32, какбы сказать, это извращенческий метод юзать второй список.
Мой код тоже нормально всё обработал и вывел без пустых строк.
Ничо, нормально. AquaKlaster - молодец. Плюс ему за это.
А код можно всегда оптимизировать. Хоть через 5 memo - ГЛАВНОЕ ЧТОБЫ РАБОТАЛ КАК НАДО!.
AquaKlaster
05.06.2010, 09:35
Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(
Как бы само мемо в конце добавляет перевод строки
ЗЫ я дал 2 примера с 1 списком и с двумя списками
Как бы само мемо в конце добавляет перевод строки
А убрать это никак? НЕВОЗМОЖНО? :confused:
Собственно говоря чем она тебе мешает последняя строка.?
Собственно говоря чем она тебе мешает последняя строка.?
Собственно говоря ничем.
Можно образовать массив строк без последней. то что мне нужно
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot