Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 314877
            [titulo] => Como Ordenar Arquivo Texto ?
            [dataCadastro] => DateTime Object
                (
                    [date] => 2006-03-03 00:00:00
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 234697
            [status] => A
            [isExample] => 
            [NomeUsuario] => RJun
            [Login] => forum.RJun
            [Apelido] => 
            [Foto] => 
            [Conteudo] => Você esta certo. Tem um erro no código mesmo. Crie mais uma StringList para guardar a lista trabalhada. Teste e veja se funciona.

[code:1:2fe0300d12]
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;
[/code:1:2fe0300d12]


) )

Como Ordenar Arquivo Texto ?

Fabiano Góes
   - 03 mar 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 !!!


Post mais votado

Rjun
   - 03 mar 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.

#Código

:1:2fe0300d12]
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;
:1:2fe0300d12]


Kitsystem
   - 03 mar 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


Edilcimar
   - 03 mar 2006

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


Fabiano Góes
   - 03 mar 2006

Edilcimar,

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


Rjun
   - 03 mar 2006

Eu não testei. Veja se funciona.

#Código


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;




Aroldo Zanela
   - 03 mar 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)


Fabiano Góes
   - 03 mar 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....


Rjun
   - 03 mar 2006

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


Fabiano Góes
   - 03 mar 2006

RJun,
Desculpe a minha iguinorancia.

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

o arquivo original:
#Código


000001011758900330108117000000015980
000001011802410330108203000000017605
000001100024501043013201000000007600
000001101386311510112112000000005000
000001254456853410553116000000003000


o seu codigo gera assim:

#Código

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.


Fabiano Góes
   - 03 mar 2006

Ah, deve manter tambem a seguencia de campo tipo:
#Código


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 #Código
(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


Fabiano Góes
   - 03 mar 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 !!!!