Como Ordenar Arquivo Texto ?

Delphi

03/03/2006

Tenho um arquivo texto de 36 posições sendo:

[01, 06] = CHEQUE
[07, 08] = CONTA
[15, 03] = BANCO
[18, 04] = AGENCIA
[22, 01] = PASSADA
[23, 02] = ESCANINHO
[25, 12] = VALOR

gostaria de ordenar assim

CONTA, CHEQUE, BANCO, AGENCIA

só que ainda tem um porem:

a CONTA - que é de 08 deve ser ordenado pelos 07 primeiros caracter
o CHEQUE - que é de 06 deve ser ordenado pelos ultimos 04 caracter
BANCO - os 03
agencia - os 04

Não sei se deu pra entender, não sei se é possivel fazer isso com texto ou terei que jogar em um banco de dados depois fazer um select, se der pra fazer com texto eu prefiro.

Bom galera essa está dificil espero que os craques aqui do forum consiga resolver, se não estou perdido :(

ate mais !!!


Fabiano Góes

Fabiano Góes

Curtidas 0

Melhor post

Rjun

Rjun

03/03/2006

Você esta certo. Tem um erro no código mesmo. Crie mais uma StringList para guardar a lista trabalhada. Teste e veja se funciona.

var 
  Origem: TStringList;  // Objeto que irá conter a lista ordenada 
  TempList: TStringList; 
  Buffer: TStringList;  // Objeto temporário que irá ordernar a lista 
  i: integer; 
begin 
  Origem := TStringList.Create; 
  Buffer := TStringList.Create; 
  TempList := TStringList.Create;
  try 
    Origem.LoadFromFile(Arquivo); 
    TempList.LoadFromFile(Arquivo);

    // Monta cada linha para ser ordenada e acrescenta o caracter ´*´ mais 
    // o indice da linha 
    for i := 0 to (Origem.Count - 1) do 
      Buffer.Add(RetornaLinha(Origem.Strings[i]) + ´*´ + IntToStr(i)); 

    // Ordena a lista 
    Buffer.Sorted := true; 

    // Apaga a lista inicial 
    Origem.Clear; 

    // Para montar a lista ordenada completa, devemos pegar de cada linha da lista 
    // ordenada o indice e adicionar na lista completa 
    for i := 0 to (Buffer.Count - 1) do 
      Origem.Add(TempList[RetornaIndice(Buffer.Strings[i])]); 

    // Salvamos a lista completa ordenada no arquivo 
    Origem.SaveToFile(Arquivo); 
  finally 
    FreeAndNil(Origem); 
    FreeAndNil(Buffer); 
    FreeAndNil(TempList);
  end; 

end; 



GOSTEI 1

Mais Respostas

Kitsystem

Kitsystem

03/03/2006

Arquivo texto não tem indexação.

Vc tera que importar para um banco de dados ou um listbox e ordenar ou crar uma função com record para tratar o arquivo texto


GOSTEI 0
Edilcimar

Edilcimar

03/03/2006

tente jogar dentro de uma matriz, depois vc arruma a matriz do jeito que quiser


GOSTEI 0
Fabiano Góes

Fabiano Góes

03/03/2006

Edilcimar,

Será que você ou alguem poderia me dar um exemplo de como fazer isso com matriz ???


GOSTEI 0
Rjun

Rjun

03/03/2006

Eu não testei. Veja se funciona.

procedure OrdenarArquivoTexto(Arquivo: string);

  // Retorna os caracteres que devem ser ordenados
  function RetornaLinha(Linha: string) : string;
  begin
    result := Copy(Linha, 7, 7) + Copy(Linha, 2, 4) + Copy(Linha, 15, 3) + Copy(Linha, 18, 4);
  end;

  // Retorna o indice da linha ordenada
  function RetornaIndice(Linha: string) : integer;
  var
    Posicao,
    Restante: integer;
  begin
    Posicao := Pos(´*´, Linha);
    Restante := Length(Linha) - Posicao;

    result := StrToInt(Copy(Linha, Posicao + 1, Restante));
  end;

var
  Origem: TStringList;  // Objeto que irá conter a lista ordenada
  Buffer: TStringList;  // Objeto temporário que irá ordernar a lista
  i: integer;
begin
  Origem := TStringList.Create;
  Buffer := TStringList.Create;
  try
    Origem.LoadFromFile(Arquivo);

    // Monta cada linha para ser ordenada e acrescenta o caracter ´*´ mais
    // o indice da linha
    for i := 0 to (Origem.Count - 1) do
      Buffer.Add(RetornaLinha(Origem.Strings[i]) + ´*´ + IntToStr(i));

    // Ordena a lista
    Buffer.Sorted := true;

    // Apaga a lista inicial
    Origem.Clear;

    // Para montar a lista ordenada completa, devemos pegar de cada linha da lista
    // ordenada o indice e adicionar na lista completa
    for i := 0 to (Buffer.Count - 1) do
    begin
      ShowMessage(Buffer.Strings[i]);
      Origem.Add(Buffer[RetornaIndice(Buffer.Strings[i])]);
    end;

    // Salvamos a lista completa ordenada no arquivo
    Origem.SaveToFile(Arquivo);
  finally
    FreeAndNil(Origem);
    FreeAndNil(Buffer);
  end;

end;




GOSTEI 1
Aroldo Zanela

Aroldo Zanela

03/03/2006

Colega,

Minha sugestão seria algo parecido com a do RJun (usando TStringList). Só por curiosidade - Você está implementando um sistema para classificadora de cheques? (ABC Bull, NCR, Etc)


GOSTEI 0
Fabiano Góes

Fabiano Góes

03/03/2006

Aroldo,
sim estou implementando um sistema para classificadora de cheques,
o sistema já esta gerando tabela para a Bull(Recognition) e agora estou tentando gerar para a NCR.

Você poderia me dar um codigo exemplo de como ordenar esses arquivo com TStringList ????

Grato....


GOSTEI 0
Rjun

Rjun

03/03/2006

O código que te passei não funcionou?


GOSTEI 0
Fabiano Góes

Fabiano Góes

03/03/2006

RJun,
Desculpe a minha iguinorancia.

o seu codigo funciona, porem ele não mantem o mesmo layout, ou seja:

o arquivo original:
000001011758900330108117000000015980
000001011802410330108203000000017605
000001100024501043013201000000007600
000001101386311510112112000000005000
000001254456853410553116000000003000


o seu codigo gera assim:

371379300693412962937000000014429*1793
381071427433410140145000000016000*9999
122140535063991212056000000020617*9416
103356900031041634698000000024200*12663
400045702161510084571000000008446*3687
342003304403410146332000000018045*4836


o original layout é de 36 posições ele apenas deveria ser reordenadoe manter as mesmas 36 posições.

o seu codigo tirando o *Indice fica com 33 posições.

Desculpe, mais esta confuso pra mim tambem, não sei se estou conseguindo me expressar.


GOSTEI 0
Fabiano Góes

Fabiano Góes

03/03/2006

Ah, deve manter tambem a seguencia de campo tipo:
CHEQUE[01, 06] + CONTA[07, 08] + BANCO[15, 03] + AGENCIA[18, 04] + PASSADA[22, 01] + ESCANINHO[23, 02] + VALOR[25, 12] 


Apenas com a ordenação diferente
(CONTA, CHEQUE, BANCO, AGENCIA)

Só que:
a CONTA - que é de 08 deve ser ordenado pelos 07 primeiros caracter
o CHEQUE - que é de 06 deve ser ordenado pelos ultimos 04 caracter
BANCO - os 03
agencia - os 04


GOSTEI 0
Fabiano Góes

Fabiano Góes

03/03/2006

RJun,
:D

Exatamente o que eu precisava !!!!!!!!

Valeu cara, você é craque mesmo heimmmm, parabens !!!

Quando eu tiver ao menos um pouco do seu conhecimento espero poder ajudar outras pessoas aqui no forum também

Grato.....

Até mais !!!!


GOSTEI 0
POSTAR