ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Удаление пустых строк
  #1  
Старый 04.06.2010, 20:59
Аватар для Dimon32
Dimon32
Познающий
Регистрация: 06.05.2010
Сообщений: 34
Провел на форуме:
20723

Репутация: 0
Exclamation Удаление пустых строк

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

Я долго немог найти ответ в Гугле. Но истина где то рядом...
Я думаю должно быть простое и гениальное решение для этой НЕВЕРОЯТНО трудно задачи!
 
Ответить с цитированием

  #2  
Старый 04.06.2010, 21:07
Аватар для TrueBit
TrueBit
Познающий
Регистрация: 21.11.2009
Сообщений: 77
Провел на форуме:
2482290

Репутация: 29
По умолчанию

Попробуй так:
PHP код:
for i:=memo1.lines.count-1 downto 0 do 
begin
if memo1.lines.strings[i]='' then 
memo1
.lines.delete(i);
end
 
Ответить с цитированием

  #3  
Старый 04.06.2010, 21:08
Аватар для crystalbit
crystalbit
Участник форума
Регистрация: 06.06.2008
Сообщений: 171
Провел на форуме:
1085601

Репутация: 110
Отправить сообщение для crystalbit с помощью ICQ
По умолчанию

используй trim(Memo1.Lines.Strings[i]) вместо Memo1.Lines.Strings[i] в условиях.

во втором варианте цикл неверный, количество меняется при удалении строки. верно будет for i:=memo1.lines.count-1 downto 0 do
 
Ответить с цитированием

  #4  
Старый 04.06.2010, 21:11
Аватар для slesh
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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

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

  #5  
Старый 04.06.2010, 21:14
Аватар для flacs
flacs
Познающий
Регистрация: 28.01.2009
Сообщений: 90
Провел на форуме:
432613

Репутация: 80
По умолчанию

Код:
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;
Должно все работать)
 
Ответить с цитированием

  #6  
Старый 04.06.2010, 21:15
Аватар для wolmer
wolmer
Постоянный
Регистрация: 12.05.2009
Сообщений: 395
Провел на форуме:
4761503

Репутация: 229
По умолчанию

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

  #7  
Старый 04.06.2010, 21:48
Аватар для GhostOnline
GhostOnline
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме:
828081

Репутация: 84
По умолчанию

Пустая строка в мемо это на самом деле #13#10, т.е. как бы не совсем пустая
 
Ответить с цитированием

Не работает
  #8  
Старый 05.06.2010, 08:51
Аватар для Dimon32
Dimon32
Познающий
Регистрация: 06.05.2010
Сообщений: 34
Провел на форуме:
20723

Репутация: 0
Thumbs down Не работает

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

Не работает
  #9  
Старый 05.06.2010, 08:56
Аватар для Dimon32
Dimon32
Познающий
Регистрация: 06.05.2010
Сообщений: 34
Провел на форуме:
20723

Репутация: 0
Thumbs down Не работает

Цитата:
Сообщение от TrueBit  
Попробуй так:
PHP код:
for i:=memo1.lines.count-1 downto 0 do 
begin
if memo1.lines.strings[i]='' then 
memo1
.lines.delete(i);
end
Проверил - тоже не работает.
Остаются и пустые строки и строки из пробелов.
 
Ответить с цитированием

Не работает
  #10  
Старый 05.06.2010, 09:01
Аватар для Dimon32
Dimon32
Познающий
Регистрация: 06.05.2010
Сообщений: 34
Провел на форуме:
20723

Репутация: 0
По умолчанию Не работает

Цитата:
Сообщение от 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;
Должно все работать)
Проверил. Не работает. Остаются и пустые строки и строки из пробелов.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обзор программ удаляющиx дубликаты строк Vanterlog ICQ 14 22.05.2010 12:13
Удаление строк из файла le-mon Болталка 7 14.06.2009 16:40
Ограничение на кол-во строк recfrf Уязвимости 1 09.02.2009 23:21
Закон Sinay Авторские статьи 15 01.02.2009 22:55



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ