Excluir Header e Trailer de TXT

Delphi

28/07/2008

Bom Dia a todos,

Estou com um arquivo importado de um banco de dados do cliente. Esse arquivo tem 3 linhas de header que preciso excluir e 1 linha no final do arquivo que tb preciso excluir.
Como poderia afzer isso?

O Arquivo é esse

Rede
Periodo:|01/07/2008|A|17/07/2008|
Suc|Apolice|Item|Endosso|Marca|Modelo|
01| 102153111|   19|  44315801|CHEVROLET      |WIND 1.0 MPFI 8V
02| 555553139|   20|  11115801|CHEVROLET      |HATCH SUPER 1.0 MPFI    
03| 471453139|   21|  44445841|CHEVROLET      |WIND 1.0 MPFI 8V   
04| 745823139|   22|  77845801|CHEVROLET      |CLASSIC 1.0 MPFI 8V   
FIM|   



Shion86

Shion86

Curtidas 0

Respostas

Aroldo Zanela

Aroldo Zanela

28/07/2008

Colega,

Veja um exemplo:

procedure TForm1.btn1Click(Sender: TObject);
var Arquivo, Campos: TStringList;
    I, N: Integer;
begin
  Arquivo := TStringList.Create;
  Campos  := TStringList.Create;

  Arquivo.LoadFromFile(´d:\dados\arquivo.txt´);

  N := Arquivo.Count-1;

  for I := 0 to N do
  begin
    if (I>2) and (I<N) then // Diferente de header e trailler
    begin
      Campos.Clear;
      SplitString(Arquivo[I], ´|´, Campos);

      Campos[0];  // Sucursal
      Campos[1];  // Apólice
      Campos[2];  // Item
      Campos[3];  // Endosso
      Campos[4];  // Marca
      Campos[5];  // Modelo

    end;

  end;

  Campos.Free;
  Arquivo.Free;


end;
Function IScan( ch: Char; Const S: String; fromPos: Integer ): Integer;
var i: Integer;
Begin
  Result := 0;
  For i := fromPos To Length(S) Do
  Begin
    If S[i] = ch Then Begin
      Result := i;
      Break;
    End;
  End;
End;

Procedure SplitString( Const S: String; separator: Char; substrings: TStringList );
var i, n: Integer;
Begin
  If Assigned( substrings ) and ( Length( S )>0 ) Then
  Begin
    i:= 1;
    Repeat
      n := IScan( separator, S, i );
      If n = 0 Then
        n:= Length( S )+1;
      substrings.Add( Copy( S,i,n-i ));
      i:= n+1;
    Until i>Length( S );
  End;
End;



GOSTEI 0
Shion86

Shion86

28/07/2008

Oi Aroldo, mto obrigado pelo exemplo.

surgiu uma dúvida, como faço agora p gravar os dados no mesmo arquivo TXT??


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/07/2008

Colega,

Você pode explicar um pouco mais sobre a sua necessidade?


GOSTEI 0
Luciano.lirio

Luciano.lirio

28/07/2008

Faz assim que da certo.

procedure TForm1.Button1Click(Sender: TObject);
var
  ArqEnt: TextFile;
  ArqSai: TextFile;
  Linha: String;
  NomeEntrada: String;
  NomeTemp: String;
begin
  NomeEntrada := ´C:\Teste.txt´;
  NomeTemp := ´C:\Teste.tmp´;
  Reset(ArqEnt,NomeEntrada);
  ReWrite(ArqSai,NomeTemp);
  ReadLn(ArqEnt,Linha);
  ReadLn(ArqEnt,Linha);
  ReadLn(ArqEnt,Linha);
  while not eof(ArqEnt) do
  begin
    ReadLn(ArqEnt,Linha);
    if UpperCase(Copy(Linha,1,3)) = ´FIM´ then Break;
    WriteLn(ArqSai,Linha);
  end;
  CloseFile(ArqEnt);
  CloseFile(ArqSai);
  DeleteFile(NomeEntrada);
  RenameFile(NomeTemp,NomeEntrada);
end;



GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/07/2008

Oi Aroldo, mto obrigado pelo exemplo. surgiu uma dúvida, como faço agora p gravar os dados no mesmo arquivo TXT??

Colega,

Seria interessante você expor a sua necessidade com mais detalhe, caso necessite de fazer algo mais além de simplesmente remover header e trailler. Se for só isso mesmo, o código abaixo também resolve. Porém, caso o arquivo seja processado mais de uma vez, haverá perdas de dados. Normalmente, é prudente utilizar uma extensão diferente para o arquivo processado, visando evitar isso.

Veja um exemplo da forma que você solicitou:

procedure TForm1.btn1Click(Sender: TObject);
begin
  with TStringList.Create do
  begin
    LoadFromFile(´d:\dados\arquivo.txt´);
    Delete(0); // Remove a primeira linha na posição 0 e reorganiza
    Delete(0); // Remove a segunda linha que agora está na posição 0 e reorganiza
    Delete(0); // Remove a terceira linha que agora está na posição 0 e reorganiza
    Delete(Count-1); // Remove a última linha
    SaveToFile(´d:\dados\arquivo.txt´);
  end;
end;



GOSTEI 0
Shion86

Shion86

28/07/2008

Bom dia a todos,

Aroldo, desculpe se me expressei mal.

Vou tentar explicar melhor, eu recebo diariamente do cliente um arquivo em formato TXT e esse arquivo vem dados da base deles.
O problema é que são vários arquivos e sempre com header(3 linhas) e trailler(1 linha), então eu sempre tenho que fazer o processo de abrir 1 por 1 dos arquivos e excluir manualmente.

Fiz os testes aqui com os programinhas que vc e o Luciano me passaram e funcionouuu perfeitamente :D !!!

Muito Obrigado pela ajuda de vcs !!!

Abraços!


GOSTEI 0
POSTAR