Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Organizar lista de texto por grupos


geovanepc

Pergunta

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

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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_empresaacme
josé_empresaacme
joão_empresamodelo
joão_empresasiscuca
manoel_empresaacme
manoel_empresamodelo
maria_empresaacme
maria_empresamodelo
maria_empresasiscuca
sergio_empresaacme
sergio_empresasiscuca

e depois alfabeticamente pelo nome da empresa, e joga o resultado no Memo2

isabel_empresaacme
josé_empresaacme
manoel_empresaacme
maria_empresaacme
sergio_empresaacme
joão_empresamodelo
manoel_empresamodelo
maria_empresamodelo
joão_empresasiscuca
maria_empresasiscuca
sergio_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

 

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...