Como Ordenar Arquivo Texto ?

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

Melhor resposta

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&93;) + ´*´ + 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&91;i&93;)&93;); 

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

end; 



Rjun

Responder Citar

Outras Respostas

03/03/2006

Kitsystem

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


Responder Citar

03/03/2006

Edilcimar

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


Responder Citar

03/03/2006

Fabiano Góes

Edilcimar,

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


Responder Citar

03/03/2006

Rjun

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&93;) + ´*´ + 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&91;i&93;);
      Origem.Add(Buffer&91;RetornaIndice(Buffer.Strings&91;i&93;)&93;);
    end;

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

end;




Responder Citar

03/03/2006

Aroldo Zanela

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)


Responder Citar

03/03/2006

Fabiano Góes

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....


Responder Citar

03/03/2006

Rjun

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


Responder Citar

03/03/2006

Fabiano Góes

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.


Responder Citar

03/03/2006

Fabiano Góes

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


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


Responder Citar

03/03/2006

Fabiano Góes

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 !!!!


Responder Citar