Erro remover linhas em branco arquivo txt

21/03/2013

4

Tenho um arquivo com 50 linhas, algumas estão em branco e quero remove-las, vi um exemplo usando o StringList e tentei fazer assim:
var 
   arquivo: TStringList;
begin

  arquivo:= TStringList.Create;

try

  arquivo.LoadFromFile('C:\'+'mensagens '+Edit1.Text+'-'+Edit2.Text+'.txt');

  for i := 0 to arquivo.Count -1 do Begin

    if (arquivo.Strings[i] = '') then begin
      arquivo.Delete(i);  
    end;
  end;

  arquivo.SaveTofile('C:\'+'mensagens '+Edit1.Text+'-'+Edit2.Text+'.txt');

  finally
  arquivo.Free;
 end;


Ta dando este erro: List Index out of bounds (44)

O que pode ser ?

Grato.
Responder

Posts

21/03/2013

Luiz Menin

Como você vai deletando, a quantidade de linha fica menor. Enquanto isso o contador continua no 50 e tenta chegar até atravez do FOR. Como não existe mais esse número de linha, ocorre o estouro da pilha.
Responder

21/03/2013

Luiz Menin

Tente assim:

arquivo.first;
while not (arquivo.eof) do begin

if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);

arquivo.next;

end;


Aguardo retorno do resultado.
Responder

21/03/2013

Vander Carlos

arquivo.first;
while not (arquivo.eof) do begin

if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);

arquivo.next;

end;


A variável arquivo é da classe TStringList, não da pra usar o first, eof...
Responder

21/03/2013

Luiz Menin

Então tente dessa forma:

var
iCont : Integer;

for i := 0 to arquivo.Count -1 do Begin
iCont := arquivo.count;

if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);
iCont := iCont - 1;
end;

if iCont = i then exit;

end;
Responder

21/03/2013

Luiz Menin

Não estou executando o código aqui, portanto, há chance de ocorrer alguns erros de sintaxe. O importante é você entender o raciocínio e encontrar a melhor solução.
Responder

21/03/2013

Vander Carlos

Nada ainda.

Quando crio meu arquivo txt, mando neste formato:

88888888|mensagem

No memo quando escrevo a mensagem em uma linha só ele da o erro de List index out of bounds...

Quando escrevo em uma linha e dou um Enter (Mensagem + linha em branco) ele não da erro, porém não remove os espaços em branco...

Antes que complique mais, talvez você saiba resolver esse.

Quando crio o arquivo txt, ele verifica se o telefone é fixo:

if (texto <= IntToStr(5)) then begin
//As linhas em branco que quero remover são essas que criam aqui
end
else
begin
Write(arq,'numero'+'|'+'mensagem');
end;

Responder

21/03/2013

Vander Carlos

Nada ainda.

Quando crio meu arquivo txt, mando neste formato:

88888888|mensagem

No memo quando escrevo a mensagem em uma linha só ele da o erro de List index out of bounds...

Quando escrevo em uma linha e dou um Enter (Mensagem + linha em branco) ele não da erro, porém não remove os espaços em branco...

Antes que complique mais, talvez você saiba resolver esse.

Quando crio o arquivo txt, ele verifica se o telefone é fixo:

if (texto <= IntToStr(5)) then begin
//As linhas em branco que quero remover são essas que criam aqui
end
else
begin
Write(arq,'numero'+'|'+'mensagem');
end;

Responder

21/03/2013

Marcio

cara,

por que não utiliza o label ?

funcionaria bem...

faz o seguinte:


var 
 arquivo: TStringList;
label
  inicio;
begin

 arquivo:= TStringList.Create;

 try

 arquivo.LoadFromFile('C:\'+'mensagens '+Edit1.Text+'-'+Edit2.Text+'.txt');

 inicio:
 for i := 0 to arquivo.Count -1 do Begin

 if (arquivo.Strings[i] = '') then begin
 arquivo.Delete(i);
 goto inicio;
 end;
 end;

 arquivo.SaveTofile('C:\'+'mensagens '+Edit1.Text+'-'+Edit2.Text+'.txt');

 finally
 arquivo.Free;
 end;



acho que assim vai..

falow!
Responder

22/03/2013

Vander Carlos

Opa, é isso mesmo.

Obrigado :)
Responder

22/03/2013

Bruno Leandro

Vander voce pode utilizar desta forma do final para o começo. Incluse acredito que seja melhor que utilizar o goto.

for i := arquivo.Count -1 downto 0 do
Begin
if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);
end;
Responder

22/03/2013

Vander Carlos

Obrigado bruno.

Vou ficar com as duas soluções salvas.

Abraços.
Responder

22/03/2013

Bruno Leandro

Vander para explicar melhor a diferença seria assim com goto se eu tiver um arquivo conforme informação abaixo

1: Texto Linha1
2: Texto Linha2
3: Texto Linha3
.
.
.
N: Texto LinhaN
N+1: Linha Vazia
N+2: Linha Vazia
N+3: Linha Vazia
N+4: Texto Linha4

neste exemplo com goto o for vai percorrer ate acha a linha N+1 que é vazia e depois volta a linha 1, ate achar a linha N+2 e voltar a linha 1 novamente ate achar a linha N+3 e voltar denovo a linha 1 e fazer esse processo de percorrer todas as linhas a numero de vezes que encontrar a linha vazia

se neste arquivo N for 10.000 teremos testado 40.004 linhas por sempre voltarmos a linha 1

utilizando conforme o modelo que passei testariamos o numero de linhas existentes no arquivo ou seja 10.000 testes
Responder

22/03/2013

Vander Carlos

Interessante esses exemplos, nunca vi e nunca usei o goto.

E realmente se fosse pra tratar grandes registros usando o For seria muito melhor.

Obrigado :)
Responder

22/03/2013

Marcio


se neste arquivo N for 10.000 teremos testado 40.004 linhas por sempre voltarmos a linha 1

utilizando conforme o modelo que passei testariamos o numero de linhas existentes no arquivo ou seja 10.000 testes


na verdade terá testado 10.000 linhas do mesmo jeito,
porque quando volta para o label 'inicio' a contagem já diminui também...
se por exemplo tiver 10 linhas e nela tiver 2 linhas em branco, será executado
10 vezes a contagem conforme vai excluindo as linhas...

isso na verdade tem a mesma lógica do for de trás para frente...

o que importa na verdade é o código compilado gerado que será executado
N quantidade de vezes pelo processador...

Responder

22/03/2013

Bruno Leandro

Voces podem comparar a diferença no exemplo abaixo

http://ul.to/fmq5fets
Responder