Erro remover linhas em branco arquivo txt
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:
Ta dando este erro: List Index out of bounds (44)
O que pode ser ?
Grato.
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.

Vander Carlos
Curtidas 0
Respostas

Luiz Menin
21/03/2013
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.
GOSTEI 0

Luiz Menin
21/03/2013
Tente assim:
Aguardo retorno do resultado.
arquivo.first; while not (arquivo.eof) do begin if (arquivo.Strings[i] = '') then begin arquivo.Delete(i); arquivo.next; end;
Aguardo retorno do resultado.
GOSTEI 0

Vander Carlos
21/03/2013
arquivo.first;
while not (arquivo.eof) do begin
if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);
arquivo.next;
end;
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...
GOSTEI 0

Luiz Menin
21/03/2013
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;
GOSTEI 0

Luiz Menin
21/03/2013
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.
GOSTEI 0

Vander Carlos
21/03/2013
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;
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;
GOSTEI 0

Vander Carlos
21/03/2013
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;
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;
GOSTEI 0

Marcio
21/03/2013
cara,
por que não utiliza o label ?
funcionaria bem...
faz o seguinte:
acho que assim vai..
falow!
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!
GOSTEI 0

Vander Carlos
21/03/2013
Opa, é isso mesmo.
Obrigado :)
Obrigado :)
GOSTEI 0
Bruno Leandro
21/03/2013
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;
for i := arquivo.Count -1 downto 0 do
Begin
if (arquivo.Strings[i] = '') then begin
arquivo.Delete(i);
end;
GOSTEI 0

Vander Carlos
21/03/2013
Obrigado bruno.
Vou ficar com as duas soluções salvas.
Abraços.
Vou ficar com as duas soluções salvas.
Abraços.
GOSTEI 0
Bruno Leandro
21/03/2013
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
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
GOSTEI 0

Vander Carlos
21/03/2013
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 :)
E realmente se fosse pra tratar grandes registros usando o For seria muito melhor.
Obrigado :)
GOSTEI 0

Marcio
21/03/2013
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...
GOSTEI 0
Bruno Leandro
21/03/2013
Voces podem comparar a diferença no exemplo abaixo
http://ul.to/fmq5fets
http://ul.to/fmq5fets
GOSTEI 0