geovanepc Postado Junho 11, 2016 Denunciar Share Postado Junho 11, 2016 Gostaria de uma ajuda para organizar os dados vindos de um arquivo de texto, pode-se usar um Memo para receber os dados. O índice para ordenar, será o final da string usando um separador, tipo "_empresa1". Ordem inicial: joão_empresa1 joão_empresa2 josé_empresa3 maria_empresa4 maria_empresa1 manoel_empresa5 manoel_empresa1 manoel_empresa2 manoel_empresa3 ----------------------------------------------------------------- Ordem desejada: joão_empresa1 maria_empresa1 manoel_empresa1 joão_empresa2 manoel_empresa2 manoel_empresa3 josé_empresa3 maria_empresa4 manoel_empresa5 ----------------------------------------------------------------------------------------- Desde já agradeço aos colegas. Um forte abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Junho 11, 2016 Denunciar Share Postado Junho 11, 2016 Não sei se voce vai entender a lógica, mas está ai a maneira de fazer isso OBS: supondo-se que os dados ( texto ) esteja dentro de um memo, primeiro voce deve separar os numeros da string e jogar em um stringlist. depois voce pode sortear a stringlist onde os valores obtidos serão ( 1,1,1,2,2,3,3,4,5 ) em outro stringlist voce joga o conteudo da string ( joão_empresa1, joão_empresa2, josé_empresa3, maria_empresa1 ...etc ) o pulo do gato, é voce usar os indices dos stringlists para ajunta-los novamente ordenados mas para que não ocorram repetições voce deve renomear o conteudo do indice da stringlist onde estão os nomes (texto) onde o resultado sera esse: joão_empresa1 maria_empresa1 manoel_empresa1 joão_empresa2 manoel_empresa2 josé_empresa3 manoel_empresa3 maria_empresa4 manoel_empresa5 ========================================================================================= unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Memo2: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function OrdenaValores(Memo : TMemo) : String; var Valores : TStringList; ValoresX : TStringList; I, j, x, z : Integer; s : string; begin Valores := TStringList.Create; // numeros ValoresX := TStringList.Create; // texto try for I := 0 to Memo.Lines.Count-1 do begin Valores.Add(copy(Memo.Lines.Strings,pos('_',Memo.Lines.Strings)+8,1)); ValoresX.Add(Memo.Lines.Strings); end; Valores.Sort; for j := 0 to ValoresX.count - 1 do for I := 0 to Valores.Count - 1 do begin if pos(Valores.Strings[j], ValoresX.Strings) >0 then begin Result := Result + ValoresX.Strings + #13; ValoresX.Strings := 'xxxxxxxxxxxxxxxxxx'; end; end finally FreeAndNil(Valores); end;end; procedure TForm1.Button1Click(Sender: TObject);begin Memo2.lines.text := OrdenaValores(Memo1);end; end. =========================================================================== OBS: o resultado foi jogado em outro memo.... use dessa maneira ou altere o código para o seu uso abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Junho 11, 2016 Autor Denunciar Share Postado Junho 11, 2016 Obrigado pelo retorno Jhonas. Acho que não me expressei bem, na realidade os nomes após o underline não possuem números, fiz assim apenas como uma forma de melhor compreensão para desenvolvimento do código, me desculpe. Na verdade o resultado deveria ser assim: ------------------------------------------------------------------- joão_empresamodelo maria_empresamodelo manoel_empresamodelo sergio_empresaacme maria_empresaacme manoel_empresaacme isabel_empresaacme josé_empresaacme joão_empresasiscuca maria_empresasiscuca sergio_empresasiscuca ------------------------------------------------------------------- Novamente me desculpe. Fico grato se algum colega me ajudar. Um forte abraço à todos. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Junho 11, 2016 Denunciar Share Postado Junho 11, 2016 ok... experimente assim procedure Ordenar(Valores: tStrings); var i, j : integer; temp : string; begin for i := 0 to Valores.Count - 1 do for j := 0 to Valores.Count - 2 do begin if ansiUpperCase(Valores[j]) > ansiUpperCase(Valores[j + 1]) then begin TEmp := Valores[j]; Valores[j] := Valores[j + 1]; Valores[j + 1 ] := TEmp; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Ordenar(memo1.lines); end; Abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Junho 11, 2016 Autor Denunciar Share Postado Junho 11, 2016 Obrigado pelo retorno. Testei o código, mas não ordenou como deveria. Obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Junho 12, 2016 Denunciar Share Postado Junho 12, 2016 Amigo, voce deveria olhar além do obvio .... os 2 códigos vão fazer exatamente o que voce precisa bastaria inverter as posições de excução veja o exemplo que voce mesmo colocou: sergio_empresasiscuca joão_empresamodelo manoel_empresaacme manoel_empresamodelo sergio_empresaacme joão_empresasiscuca maria_empresaacme maria_empresamodelo isabel_empresaacme josé_empresaacme maria_empresasiscuca observe que eu modifiquei a sequencia que voce colocou, para lhe mostrar que o código funciona voce executa primeiramente a procedure Ordenar(Valores: tStrings); depois executa a function OrdenaValores(Memo : TMemo) : String; A UNICA DIFERENÇA ESTA NESSE COMANDO Valores.Add(copy(Memo.Lines.Strings,pos('_',Memo.Lines.Strings)+8,15)); depois que voce executa acontece isso: ordena o conteudo do Memo1 alfabeticamente pelo nome isabel_empresaacmejosé_empresaacmejoão_empresamodelojoão_empresasiscucamanoel_empresaacmemanoel_empresamodelomaria_empresaacmemaria_empresamodelomaria_empresasiscucasergio_empresaacmesergio_empresasiscuca e depois alfabeticamente pelo nome da empresa, e joga o resultado no Memo2 isabel_empresaacmejosé_empresaacmemanoel_empresaacmemaria_empresaacmesergio_empresaacmejoão_empresamodelomanoel_empresamodelomaria_empresamodelojoão_empresasiscucamaria_empresasiscucasergio_empresasiscuca OBS: voce mesmo limita o seu raciocinio lógico unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function OrdenaValores(Memo : TMemo) : String; var Valores : TStringList; ValoresX : TStringList; I, j, x, z : Integer; s : string; begin Valores := TStringList.Create; // numeros ValoresX := TStringList.Create; // string try for I := 0 to Memo.Lines.Count-1 do begin Valores.Add(copy(Memo.Lines.Strings,pos('_',Memo.Lines.Strings)+8,15)); ValoresX.Add(Memo.Lines.Strings); end; Valores.Sort; for j := 0 to ValoresX.count - 1 do for I := 0 to Valores.Count - 1 do begin if pos(Valores.Strings[j], ValoresX.Strings) >0 then begin Result := Result + ValoresX.Strings + #13; ValoresX.Strings := 'xxxxxxxxxxxxxxxxxx'; end; end finally FreeAndNil(Valores); end;end; procedure Ordenar(Valores: tStrings);var i, j : integer; temp : string;begin for i := 0 to Valores.Count - 1 do for j := 0 to Valores.Count - 2 do begin if ansiUpperCase(Valores[j]) > ansiUpperCase(Valores[j + 1]) then begin TEmp := Valores[j]; Valores[j] := Valores[j + 1]; Valores[j + 1 ] := TEmp; end; end;end; procedure TForm1.Button1Click(Sender: TObject);begin Ordenar(Memo1.Lines); Memo2.lines.text := OrdenaValores(Memo1); end; end. end. abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Julho 8, 2016 Autor Denunciar Share Postado Julho 8, 2016 Jhonas quero primeiramente agradecer pela ajuda, e frisar que o código realmente funcionou, mas não atendeu minhas necessidades, porque ficou muito lento. Fiz os testes e adaptei para meu sistema, "OBS: Quero dizer que não foi limitação de raciocínio lógico não falou" Apenas não serviu, pelo fato da lista ser grade, Mas mesmo assim obrigado pelo retorno. Vou setar um índice e utilizar By Order numa tabela em um banco de dados. Valeu. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Julho 8, 2016 Denunciar Share Postado Julho 8, 2016 ok... desculpe pela infeliz observação pesquise por indices compostos ...pode resolver tambem abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
geovanepc
Gostaria de uma ajuda para organizar os dados vindos de um arquivo de texto, pode-se usar um Memo para receber os dados.
O índice para ordenar, será o final da string usando um separador, tipo "_empresa1".
Ordem inicial:
joão_empresa1
joão_empresa2
josé_empresa3
maria_empresa4
maria_empresa1
manoel_empresa5
manoel_empresa1
manoel_empresa2
manoel_empresa3
-----------------------------------------------------------------
Ordem desejada:
joão_empresa1
maria_empresa1
manoel_empresa1
joão_empresa2
manoel_empresa2
manoel_empresa3
josé_empresa3
maria_empresa4
manoel_empresa5
-----------------------------------------------------------------------------------------
Desde já agradeço aos colegas.
Um forte abraço.
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.