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

Форум АНТИЧАТ (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;

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

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


Время: 03:38