Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Удаление пустых строк (https://forum.antichat.xyz/showthread.php?t=209162)

Dimon32 04.06.2010 20:59

Удаление пустых строк
 
У меня очень простой вопрос:
Как удалить пустые строки и строки состоящие только из пробелов из 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:

TrueBit 04.06.2010 21:07

Попробуй так:
PHP код:

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

slesh 04.06.2010 21:11

тему научись сначало правильно называть, затем хоть почитай доку по делфи, и тока потом называй это НЕВЕРОЯТНО трудной задачей.

тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно

flacs 04.06.2010 21:14

Код:


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;

Должно все работать)

wolmer 04.06.2010 21:15

Цитата:

Как удалить пустые строки и строки состоящие только из пробелов из 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, т.е. как бы не совсем пустая

Dimon32 05.06.2010 08:51

Не работает
 
Цитата:

Сообщение от wolmer
Код:

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 раз - более менее что то удалило, но все же остаются строки из пробелов.
Решение не найдено.

Dimon32 05.06.2010 08:56

Не работает
 
Цитата:

Сообщение от TrueBit
Попробуй так:
PHP код:

for i:=memo1.lines.count-1 downto 0 do 
begin
if memo1.lines.strings[i]='' then 
memo1
.lines.delete(i);
end


Проверил - тоже не работает.
Остаются и пустые строки и строки из пробелов. :(

Dimon32 05.06.2010 09:01

Не работает
 
Цитата:

Сообщение от flacs
Код:


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;

Должно все работать)

Проверил. Не работает. Остаются и пустые строки и строки из пробелов. :(

Dimon32 05.06.2010 09:09

ВОПРОС ОСТАЛСЯ ОТКРЫТЫМ.
 
Цитата:

Сообщение от slesh
тему научись сначало правильно называть, затем хоть почитай доку по делфи, и тока потом называй это НЕВЕРОЯТНО трудной задачей.

тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно

Цитата:

Сообщение от slesh
тему научись сначало правильно называть

Тема названа так - потому что это действительно не простая задача, как оказалось - ни один из предложенных вариантов пользователями этого форума не сработал.

Цитата:

Сообщение от slesh
затем хоть почитай доку по делфи

Я дофига прочитал, а нормального удаления пустых строк и строк состоящих из пробелов не нашел. Все методы не дают достаточного результата.
Если знаеш учебник, который я пропустил - ткни пальцем. Буду очень благодарен.

Цитата:

Сообщение от slesh
тебе реально достаточно пробежаться по всем элементам и сравнить по двум условиям
1) пустая строка. просто проверяй <> '';
2) проверя строку на пробелы. циклом прогоняй по всем символам и если символ не пробел, то строку оставляй в покое. тоже самое и на табуляторы проверяй.
Хотя можеш и trim заюзать, но всё равно могут быть еще непечатные символы, которые трим может пропустить случайно

На словах то каждый тут просто гений, а реально работающий код никто не может предложить. Не ужели эта задача нерешаема? :confused:

slesh 05.06.2010 09:14

Может у тебя проблема в том, что в 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;


Dimon32 05.06.2010 09:24

HTML код в мемо находится.
 
Цитата:

Сообщение от slesh
Может у тебя проблема в том, что в 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

slesh 05.06.2010 09:26

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

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

Dimon32 05.06.2010 09:27

СРАБОТАЛО!!!
 
Цитата:

Сообщение от AquaKlaster
Код:

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

Цитата:

Сообщение от Dimon32
Чувак!!!! ты гений!! Невероятно, но это сработало! :D
Спасибо большое!

Советую юзать мой второй код, он работает с 1 memo!

Dimon32 05.06.2010 09:29

Цитата:

Сообщение от AquaKlaster
Кидай такой длинный текст в тег CODE

Ваш этот тег убирает как раз ненужные строки))). (Когда вставляеш)

slesh 05.06.2010 09:30

Dimon32, какбы сказать, это извращенческий метод юзать второй список.
Мой код тоже нормально всё обработал и вывел без пустых строк.

Dimon32 05.06.2010 09:31

Цитата:

Сообщение от AquaKlaster
Советую юзать мой второй код, он работает с 1 memo!

Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(

Dimon32 05.06.2010 09:32

ПОСЛЕДНЯЯ НЕНУЖНАЯ СТРОКА ТО ОСТАЕТСЯ(((
 
Цитата:

Сообщение от AquaKlaster
Советую юзать мой второй код, он работает с 1 memo!

Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(

Dimon32 05.06.2010 09:35

Цитата:

Сообщение от slesh
Dimon32, какбы сказать, это извращенческий метод юзать второй список.
Мой код тоже нормально всё обработал и вывел без пустых строк.

Ничо, нормально. AquaKlaster - молодец. Плюс ему за это.
А код можно всегда оптимизировать. Хоть через 5 memo - ГЛАВНОЕ ЧТОБЫ РАБОТАЛ КАК НАДО!.

AquaKlaster 05.06.2010 09:35

Цитата:

Сообщение от Dimon32
Да, действительно. второй код удобней. Но все таки есть один недостаток- последняя строка то остается! :(

Как бы само мемо в конце добавляет перевод строки

ЗЫ я дал 2 примера с 1 списком и с двумя списками

Dimon32 05.06.2010 09:38

Убрать последнюю строку НЕВОЗМОЖНО
 
Цитата:

Сообщение от AquaKlaster
Как бы само мемо в конце добавляет перевод строки

А убрать это никак? НЕВОЗМОЖНО? :confused:

slesh 05.06.2010 09:42

Собственно говоря чем она тебе мешает последняя строка.?

Dimon32 05.06.2010 09:44

Цитата:

Сообщение от slesh
Собственно говоря чем она тебе мешает последняя строка.?

Собственно говоря ничем.
Можно образовать массив строк без последней. то что мне нужно


Время: 10:16