Ajuda com relação de números
Boa tarde.
Estou precisando de ajuda para resolver um problema. Eu tenho a seguinte relação de números em uma arquivo txt e estou carregando em um memo ou listbox:
3,4,5,8,10,11,23,25,27,31,37,43,44,45,49
1,2,4,5,6,9,12,13,17,19,25,27,30,31,40
1,2,4,5,6,7,8,9,10,11,12,13,14,15,44,45
etc...
Reparem que a primeira linha tem os números em sequencia; 4,5 - 25,27. A linha dois também tem a mesma sequencia; 4,5 - 25,27.
A linha dois tem a sequencia 1,2,4,5,6 - 12,13. A linha três também tem a mesma sequencia 1,2,4,5,6 - 12,13.
A linha três tem a sequencia 44,45. A primeira linha também tem a mesma sequencia 44,45.
Não sei se expliquei direito, mas o que eu preciso é percorre uma lista de números e identificar se existem números repetidos, ou seja, se na linha X existe o número 1 e na linha Y também existe ele vai separar essas duas linhas para que eu saiba que nelas existem números iguais. Porém deve ser de forma sequencial conforme exemplo acima.
Se por acaso existir o número 20 em uma linha e 20 em outra, porém se o numero seguinte for 21 em uma linha e 22 na outra, ele não vai separar essa linhas pois não houve repetição de sequencia(20,21 - 20,22) e essa sequencia pode ser 2 e 2, 3 e 3, 4 e 4 sucessivamente. E como também citado no exemplo, pode haver mais de uma sequencia repetida entre linhas.
Não se ficou claro, mas como fazer isso?
Estou precisando de ajuda para resolver um problema. Eu tenho a seguinte relação de números em uma arquivo txt e estou carregando em um memo ou listbox:
3,4,5,8,10,11,23,25,27,31,37,43,44,45,49
1,2,4,5,6,9,12,13,17,19,25,27,30,31,40
1,2,4,5,6,7,8,9,10,11,12,13,14,15,44,45
etc...
Reparem que a primeira linha tem os números em sequencia; 4,5 - 25,27. A linha dois também tem a mesma sequencia; 4,5 - 25,27.
A linha dois tem a sequencia 1,2,4,5,6 - 12,13. A linha três também tem a mesma sequencia 1,2,4,5,6 - 12,13.
A linha três tem a sequencia 44,45. A primeira linha também tem a mesma sequencia 44,45.
Não sei se expliquei direito, mas o que eu preciso é percorre uma lista de números e identificar se existem números repetidos, ou seja, se na linha X existe o número 1 e na linha Y também existe ele vai separar essas duas linhas para que eu saiba que nelas existem números iguais. Porém deve ser de forma sequencial conforme exemplo acima.
Se por acaso existir o número 20 em uma linha e 20 em outra, porém se o numero seguinte for 21 em uma linha e 22 na outra, ele não vai separar essa linhas pois não houve repetição de sequencia(20,21 - 20,22) e essa sequencia pode ser 2 e 2, 3 e 3, 4 e 4 sucessivamente. E como também citado no exemplo, pode haver mais de uma sequencia repetida entre linhas.
Não se ficou claro, mas como fazer isso?
Pedro
Curtidas 0
Respostas
Renato Rubinho
27/10/2014
Buenos,
Dois loops.
- Para cada número encontrado na linha 1, procura-o na linha 2.
- Se encontrar, identifica qual o próximo número de cada linha e, se forem iguais, guarda numa variável a sequencia encontrada.
- Ao final, mostra os resultados encontrados
Abraççç
Dois loops.
- Para cada número encontrado na linha 1, procura-o na linha 2.
- Se encontrar, identifica qual o próximo número de cada linha e, se forem iguais, guarda numa variável a sequencia encontrada.
- Ao final, mostra os resultados encontrados
procedure TFrmatendepedido.Button1Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
begin
sLinha1 := ',3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,';
sLinha2 := ',1,2,4,5,6,9,12,13,17,19,25,27,30,31,40,';
sResult := '';
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Se os números são iguais, valida o próximo
if sNum1 = sNum2 then
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
sResult := sResult + sNum1 + ',' + sNum3 + ' ';
end;
end;
end;
ShowMessage(sResult);
end;
Abraççç
GOSTEI 0
Pedro
27/10/2014
Boa tarde rrubinho.
Cara obrigado pela ajuda mas ainda não testei. Abusando da sua boa vontade me passa mais alguma dica.
No caso essas linhas são indeterminadas e não apenas duas. Eu vou importar essa lista de arquivos txt e cada uma tem quantidade diferente de linhas, tem arquivo com mais de mil linhas rsrsr
No caso eu tinha pensado em uma lógica mais ou menos assim como você falou mas não sei como fazer. Eu pensei no seguinte:
Ler o primeiro número da primeira linha e procurar por ele em todas as outras linhas. Se encontrar em alguma então ele faria a leitura do prox. número e se encontrar faria o mesmo com os seguintes, até encontrar sequencias 2-2, 3-3, 4-4 etc...
Mas como tem que ler cada numero um por um em cada uma das linhas, vai virar uma laço muito grande e nem tenho ideia de como resolver.
Cara obrigado pela ajuda mas ainda não testei. Abusando da sua boa vontade me passa mais alguma dica.
No caso essas linhas são indeterminadas e não apenas duas. Eu vou importar essa lista de arquivos txt e cada uma tem quantidade diferente de linhas, tem arquivo com mais de mil linhas rsrsr
No caso eu tinha pensado em uma lógica mais ou menos assim como você falou mas não sei como fazer. Eu pensei no seguinte:
Ler o primeiro número da primeira linha e procurar por ele em todas as outras linhas. Se encontrar em alguma então ele faria a leitura do prox. número e se encontrar faria o mesmo com os seguintes, até encontrar sequencias 2-2, 3-3, 4-4 etc...
Mas como tem que ler cada numero um por um em cada uma das linhas, vai virar uma laço muito grande e nem tenho ideia de como resolver.
GOSTEI 0
Renato Rubinho
27/10/2014
Imaginei que fosse isso.
Por isso fiz o exemplo com as duas variáveis sLinha1 e sLinha2.
Faz um loop das linhas do seu arquivo texto.
Para cada passo do loop, armazene na sLinha1 o conteúdo da linha posicionada.
Dentro deste loop principal, faça um segundo loop das linhas dos arquivos e, para cada passo deste segundo loop, armazene o conteúdo da linha no sLinha2.
Utilize o código que passei dentro do segundo loop após preencher a sLinha2 que ele irá processar para cada linha a validação das demais linhas. Ou crie uma função com o código que passei e chame-a passando as linhas a serem verificadas.
Obs: Não se esqueça de ignorar a validação no segundo loop para a linha que estiver posicionado no primeiro.
Posta o resultado para ficar como dica para outras pessoas que precisarem.
Abraççç,
Renato
Por isso fiz o exemplo com as duas variáveis sLinha1 e sLinha2.
Faz um loop das linhas do seu arquivo texto.
Para cada passo do loop, armazene na sLinha1 o conteúdo da linha posicionada.
Dentro deste loop principal, faça um segundo loop das linhas dos arquivos e, para cada passo deste segundo loop, armazene o conteúdo da linha no sLinha2.
Utilize o código que passei dentro do segundo loop após preencher a sLinha2 que ele irá processar para cada linha a validação das demais linhas. Ou crie uma função com o código que passei e chame-a passando as linhas a serem verificadas.
Obs: Não se esqueça de ignorar a validação no segundo loop para a linha que estiver posicionado no primeiro.
Posta o resultado para ficar como dica para outras pessoas que precisarem.
Abraççç,
Renato
GOSTEI 0
Pedro
27/10/2014
Então Renato, para testar o código eu apenas copiei e colei e não fiz nenhuma adaptação ao que eu preciso.
Na forma como você exemplificou, fazendo a comparação entre as duas linhas ele encontra 4,5 - 25,27. Certinho encontrou a ocorrência. Aí para testar mais a fundo eu alterei o valor da variável sLinha2 e ficou assim:
sLinha1 := '3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,';
sLinha2 := '1,2,4,5,6,9,12,13,17,19,25,27,44,45,49,';
Então dentro daquilo que preciso eu deveria receber o retorno: 4,5 - 25,27 - 44,45,49. Porém retornou dessa forma 4,5 - 25,27 - 44,45 - 45,49, ou seja, uma sequencia de dois em dois. O resultado em questão teria que vir 4,5 - 25,27 - 44,45,49 assim como tambem poderia ser um resultado 1,1 - 2,2,2 - 3,3,3,3 ou 1,1,1 - 2,2,2,2,2. Não necessariamente de dois em dois números.
Por exemplo cada linha vai ter uns 15 números, se tiver duas linhas exatamente iguais então ele vai retornar a sequencia 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.
Na forma como você exemplificou, fazendo a comparação entre as duas linhas ele encontra 4,5 - 25,27. Certinho encontrou a ocorrência. Aí para testar mais a fundo eu alterei o valor da variável sLinha2 e ficou assim:
sLinha1 := '3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,';
sLinha2 := '1,2,4,5,6,9,12,13,17,19,25,27,44,45,49,';
Então dentro daquilo que preciso eu deveria receber o retorno: 4,5 - 25,27 - 44,45,49. Porém retornou dessa forma 4,5 - 25,27 - 44,45 - 45,49, ou seja, uma sequencia de dois em dois. O resultado em questão teria que vir 4,5 - 25,27 - 44,45,49 assim como tambem poderia ser um resultado 1,1 - 2,2,2 - 3,3,3,3 ou 1,1,1 - 2,2,2,2,2. Não necessariamente de dois em dois números.
Por exemplo cada linha vai ter uns 15 números, se tiver duas linhas exatamente iguais então ele vai retornar a sequencia 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.
GOSTEI 0
Renato Rubinho
27/10/2014
Nas outras explicações você havia colocado exemplo de 2 apenas.
To enrolado agora, mas ao invés do último if, troquei por while e repliquei o incremento de posição das linhas para validar em sequência quantos existirem.
Ficou grosseiro, mas aparentemente funcionou.
Veja se é isso e caso o resultado esteja correto, veja de talvez fazer uma função recursiva que deve ter um resultado melhor.
Abraççç,
Renato
To enrolado agora, mas ao invés do último if, troquei por while e repliquei o incremento de posição das linhas para validar em sequência quantos existirem.
Ficou grosseiro, mas aparentemente funcionou.
Veja se é isso e caso o resultado esteja correto, veja de talvez fazer uma função recursiva que deve ter um resultado melhor.
procedure TFrmatendepedido.Button1Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sResult2 : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
bAux1 : boolean;
begin
sLinha1 := ',3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,54,54,54,';
sLinha2 := ',1,2,4,5,6,9,12,13,17,19,25,27,30,31,40,54,54,54,';
sResult := '';
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Se os números são iguais, valida o próximo
sResult2 := sNum1;
bAux1 := False;
while sNum1 = sNum2 do
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
begin
sResult2 := sResult2 + ',' + sNum3;
bAux1 := True;
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
end
else
sNum2 := '';
end;
if bAux1 then
sResult := sResult + sResult2 + ' ';
end;
end;
ShowMessage(sResult);
end;
Abraççç,
Renato
GOSTEI 0
Pedro
27/10/2014
Renato, era isso mesmo. Funcionou Blz!
Muito obrigado mesmo.
Agora vou adaptar ao meu projeto, qualquer dúvida eu posto aqui e mais uma vez muito obrigado mesmo.
Muito obrigado mesmo.
Agora vou adaptar ao meu projeto, qualquer dúvida eu posto aqui e mais uma vez muito obrigado mesmo.
GOSTEI 0
Pedro
27/10/2014
Tentei adaptar o código mas não esta dando nenhum resultado, ou seja, eu clico no botão e não acontece nada.
veja:
procedure TForm1.Button2Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sResult2 : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
bAux1 : boolean;
arq : TextFile;
linha : string;
i : Integer;
begin
i := 1;
AssignFile(arq, 'C:\teste\teste.txt');
Reset(arq);
while not eof(arq) do
begin
readln(arq, linha);
sLinha1 := linha;
i := i + 1;
while not eof(arq) do
begin
readln(arq, linha[i]);
sLinha2 := linha;
sResult := '';
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Se os números são iguais, valida o próximo
sResult2 := sNum1;
bAux1 := False;
while sNum1 = sNum2 do
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
begin
sResult2 := sResult2 + ',' + sNum3;
bAux1 := True;
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
end
else
sNum2 := '';
end;
if bAux1 then
sResult := sResult + sResult2 + ' ';
end;
end;
end;
end;
ShowMessage(sResult);
CloseFile(arq);
end;
veja:
procedure TForm1.Button2Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sResult2 : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
bAux1 : boolean;
arq : TextFile;
linha : string;
i : Integer;
begin
i := 1;
AssignFile(arq, 'C:\teste\teste.txt');
Reset(arq);
while not eof(arq) do
begin
readln(arq, linha);
sLinha1 := linha;
i := i + 1;
while not eof(arq) do
begin
readln(arq, linha[i]);
sLinha2 := linha;
sResult := '';
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Se os números são iguais, valida o próximo
sResult2 := sNum1;
bAux1 := False;
while sNum1 = sNum2 do
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
begin
sResult2 := sResult2 + ',' + sNum3;
bAux1 := True;
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
end
else
sNum2 := '';
end;
if bAux1 then
sResult := sResult + sResult2 + ' ';
end;
end;
end;
end;
ShowMessage(sResult);
CloseFile(arq);
end;
GOSTEI 0
Renato Rubinho
27/10/2014
Buenas,
1. Você usava a mesma variável de arquivo para os dois loops, controlando o segundo loop com a variável "i", mas não zerava ela num novo passo do primeiro loop. Alterei para uma variável por loop.
2. Zerava o sResult dentro do loop apagando algo que tivesse sido preenchido em loops anteriores. Zerei o sResult fora do primeiro loop.
3. Coloquei #13 após o resultado gravado para separar os grupos encontrados.
Falta colocar tratamento para ignorar a própria linha do primeiro loop no segundo.
1. Você usava a mesma variável de arquivo para os dois loops, controlando o segundo loop com a variável "i", mas não zerava ela num novo passo do primeiro loop. Alterei para uma variável por loop.
2. Zerava o sResult dentro do loop apagando algo que tivesse sido preenchido em loops anteriores. Zerei o sResult fora do primeiro loop.
3. Coloquei #13 após o resultado gravado para separar os grupos encontrados.
Falta colocar tratamento para ignorar a própria linha do primeiro loop no segundo.
procedure TFrmPrincipal.Button1Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sResult2 : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
bAux1 : boolean;
arq : TextFile;
arq2 : TextFile;
linha : string;
begin
AssignFile(arq, 'C:\temp\teste.txt');
Reset(arq);
AssignFile(arq2, 'C:\temp\teste.txt');
sResult := '';
while not eof(arq) do
begin
readln(arq, linha);
sLinha1 := linha;
Reset(arq2);
while not eof(arq2) do
begin
readln(arq2, linha);
sLinha2 := linha;
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Se os números são iguais, valida o próximo
sResult2 := sNum1;
bAux1 := False;
while sNum1 = sNum2 do
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
begin
sResult2 := sResult2 + ',' + sNum3;
bAux1 := True;
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
end
else
sNum2 := '';
end;
if bAux1 then
sResult := sResult + sResult2 + #13;
end;
end;
end;
end;
CloseFile(arq);
CloseFile(arq2);
ShowMessage(sResult);
end;
GOSTEI 0
Pedro
27/10/2014
Boa tarde Renato.
Então, copiei e colei esse código que você postou mas continua do mesmo jeito; sem acontecer nada.
No caso a variável (i) eu coloquei justamente para ignorar a linha lida no primeiro loop do segundo. Ela inicia valendo 1 e em cada passagem no primeiro loop incrementa +1 assim indica em que linha do arquivo a função readln deve começar a ler no segundo loop. Não sei se expliquei direito, mas como sou iniciante não sei como colocar isso no código.
No caso existe uma forma de fazer o readln ler a partir de uma determinada linha?
Então, copiei e colei esse código que você postou mas continua do mesmo jeito; sem acontecer nada.
No caso a variável (i) eu coloquei justamente para ignorar a linha lida no primeiro loop do segundo. Ela inicia valendo 1 e em cada passagem no primeiro loop incrementa +1 assim indica em que linha do arquivo a função readln deve começar a ler no segundo loop. Não sei se expliquei direito, mas como sou iniciante não sei como colocar isso no código.
No caso existe uma forma de fazer o readln ler a partir de uma determinada linha?
GOSTEI 0
Renato Rubinho
27/10/2014
Buenas,
Não uso TextFile... rsrs.. Dá uma olhada no Help ou no Sr. Google como utilizar melhor.
Copiei o texto em um botão num projeto em branco e funcionou.
No meu exemplo salvei o arquivo em C:\Temp\teste.txt , diferente do seu que estava em c:\teste\teste.txt, deve ser isso.
Conteúdo do arquivo c:\temp\teste.txt:
,3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,54,54,54,
,1,2,4,5,6,9,12,13,17,19,25,27,30,31,40,54,54,54,
Abraççç
Não uso TextFile... rsrs.. Dá uma olhada no Help ou no Sr. Google como utilizar melhor.
Copiei o texto em um botão num projeto em branco e funcionou.
No meu exemplo salvei o arquivo em C:\Temp\teste.txt , diferente do seu que estava em c:\teste\teste.txt, deve ser isso.
Conteúdo do arquivo c:\temp\teste.txt:
,3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,54,54,54,
,1,2,4,5,6,9,12,13,17,19,25,27,30,31,40,54,54,54,
Abraççç
GOSTEI 0
Pedro
27/10/2014
Então Renato,
Acho que estou estou quase lá com a sua ajuda. Fiz alguns testes...
No caso precisei criar outra variável linha 2 então mudei o seguinte:
while not eof(arq2) do
begin
readln(arq2, linha);
sLinha2 := linha;
para
while not eof(arq2) do
begin
readln(arq2, linha2);
sLinha2 := linha2;
Tentei de tudo e não consegui trabalhar apenas com a leitura do TXT então fiz uma "gambiarra", carreguei o mesmo em dois memos.
Aí fiz o laço para ler o primeiro e depois ler o segundo excluindo a linha posicionada no primeiro laço e demais linhas já lidas no primeiro laço. Ficou assim:
x := 0;
sResult := '';
for I := 0 to Memo1.Lines.Count do
begin
sLinha1 := Memo1.Lines[i];
x := x + 1;
for y := x to Memo2.Lines.Count do
begin
sLinha2 := Memo2.Lines[y];
Dessa forma ele retorna, mas tem um detalhe: se eu retirar a vírgula do início e fim de cada linha, não acontece nada quando clico no botão. Mas se mantenho a vírgula retorna as sequencias.
O engraçado é que tanto no primeiro exemplo que você me passou quanto neste último, ao invés de ler o arquivo eu usei as duas variáveis sLinha1 e sLinha2 já com os valores definidos, igualzinho o primeiro exemplo e tanto com a vírgula no início e fim quanto sem elas ele retorna a sequencia. Agora se a sequencia vem do laço, lendo o TXT se tirar as vírgulas(início e fim) não funciona.
Por que será? E qual seria a importância de ter as vírgulas no início e fim? Penso porque o os arquivos txt não vão ter elas.
Acho que estou estou quase lá com a sua ajuda. Fiz alguns testes...
No caso precisei criar outra variável linha 2 então mudei o seguinte:
while not eof(arq2) do
begin
readln(arq2, linha);
sLinha2 := linha;
para
while not eof(arq2) do
begin
readln(arq2, linha2);
sLinha2 := linha2;
Tentei de tudo e não consegui trabalhar apenas com a leitura do TXT então fiz uma "gambiarra", carreguei o mesmo em dois memos.
Aí fiz o laço para ler o primeiro e depois ler o segundo excluindo a linha posicionada no primeiro laço e demais linhas já lidas no primeiro laço. Ficou assim:
x := 0;
sResult := '';
for I := 0 to Memo1.Lines.Count do
begin
sLinha1 := Memo1.Lines[i];
x := x + 1;
for y := x to Memo2.Lines.Count do
begin
sLinha2 := Memo2.Lines[y];
Dessa forma ele retorna, mas tem um detalhe: se eu retirar a vírgula do início e fim de cada linha, não acontece nada quando clico no botão. Mas se mantenho a vírgula retorna as sequencias.
O engraçado é que tanto no primeiro exemplo que você me passou quanto neste último, ao invés de ler o arquivo eu usei as duas variáveis sLinha1 e sLinha2 já com os valores definidos, igualzinho o primeiro exemplo e tanto com a vírgula no início e fim quanto sem elas ele retorna a sequencia. Agora se a sequencia vem do laço, lendo o TXT se tirar as vírgulas(início e fim) não funciona.
Por que será? E qual seria a importância de ter as vírgulas no início e fim? Penso porque o os arquivos txt não vão ter elas.
GOSTEI 0
Pedro
27/10/2014
Esqueci... esse é o meu arquivo texte.txt
,3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,51,55,57,
,1,2,4,5,6,9,12,13,17,19,25,27,31,37,43,44,55,57,
,5,9,10,11,12,13,15,16,17,19,25,27,31,37,43,44,48,60,
,3,4,5,8,10,11,23,25,27,31,37,43,44,45,49,51,55,57,
,1,2,4,5,6,9,12,13,17,19,25,27,31,37,43,44,55,57,
,5,9,10,11,12,13,15,16,17,19,25,27,31,37,43,44,48,60,
GOSTEI 0
Pedro
27/10/2014
rrubinho blz?
Sua ajuda resolveu meu problema. Agora me dá outro dica de como faço para procurar apenas números repetidos.
Sua ajuda resolveu meu problema. Agora me dá outro dica de como faço para procurar apenas números repetidos.
GOSTEI 0
Renato Rubinho
27/10/2014
Pedro,
Mal lembrava da dessa lógica.
Segue um ajuste trazendo apenas os repetidos e ignorando a validação da própria linha.
Mal lembrava da dessa lógica.
Segue um ajuste trazendo apenas os repetidos e ignorando a validação da própria linha.
procedure TForm1.Button1Click(Sender: TObject);
var
iPosVirg1: integer;
iPosVirg2: integer;
jPosVirg1: integer;
jPosVirg2: integer;
iLinha1 : integer;
iLinha2 : integer;
sLinha1 : string;
sLinha2 : string;
sResult : string;
sResult2 : string;
sNum1 : string;
sNum2 : string;
sNum3 : string;
sNum4 : string;
bAux1 : boolean;
arq : TextFile;
arq2 : TextFile;
linha : string;
begin
AssignFile(arq, 'C:\temp\teste.txt');
Reset(arq);
AssignFile(arq2, 'C:\temp\teste.txt');
sResult := '';
// Novo - 09/03/2015
iLinha1 := -1;
// #
while not eof(arq) do
begin
Inc(iLinha1);
readln(arq, linha);
sLinha1 := linha;
Reset(arq2);
// Novo - 09/03/2015
iLinha2 := -1;
// #
while not eof(arq2) do
begin
Inc(iLinha2);
readln(arq2, linha);
sLinha2 := linha;
// Novo - 09/03/2015
if iLinha1 = iLinha2 then
begin
Next;
Continue;
end;
// #
iPosVirg1 := 1;
iPosVirg2 := Length(sLinha1);
while iPosVirg2 > iPosVirg1 do
begin
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg1 := 1;
jPosVirg2 := Length(sLinha2);
while jPosVirg2 > jPosVirg1 do
begin
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
// Novo - 09/03/2015
if sNum1 = sNum2 then
sResult := sResult + sNum2 + #13;
// #
{ Antigo - 09/03/2015
// Se os números são iguais, valida o próximo
sResult2 := sNum1;
bAux1 := False;
while sNum1 = sNum2 do
begin
sNum3 := Trim(Copy(sLinha1,iPosVirg1 + 1,(iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1))))-iPosVirg1-1));
sNum4 := Trim(Copy(sLinha2,jPosVirg1 + 1,(jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2))))-jPosVirg1-1));
if ( sNum3 = sNum4 ) and ( Trim(sNum3) <> '' ) and ( Trim(sNum4) <> '' ) then
begin
sResult2 := sResult2 + ',' + sNum3;
bAux1 := True;
// Encontra o número a ser verificado
iPosVirg2 := iPosVirg1 + Pos(',',Copy(sLinha1,iPosVirg1+1,Length(sLinha1)));
sNum1 := Trim(Copy(sLinha1,iPosVirg1 + 1,iPosVirg2-iPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
iPosVirg1 := iPosVirg2;
iPosVirg2 := Length(sLinha1);
jPosVirg2 := jPosVirg1 + Pos(',',Copy(sLinha2,jPosVirg1+1,Length(sLinha2)));
sNum2 := Trim(Copy(sLinha2,jPosVirg1 + 1,jPosVirg2-jPosVirg1-1));
// Após identificar, atualiza a posição da vírgula atual com a última vírgula encontrada
jPosVirg1 := jPosVirg2;
jPosVirg2 := Length(sLinha2);
end
else
sNum2 := '';
end;
if bAux1 then
sResult := sResult + sResult2 + #13;
}
end;
end;
end;
end;
CloseFile(arq);
CloseFile(arq2);
ShowMessage(sResult);
end;
GOSTEI 0
Pedro
27/10/2014
rrubinho,
Mas uma vez obrigado pela sua boa vontade em me ajudar. Vou testar o código e posto o resultado, mas acho que pelo o que vc falou que fez vai dar certo, vou adaptar ao que tenho e ver o acontece.
Na lógica anterior que vc me ajudou eu estava pegando um arquivo com várias linhas e comparando todas elas, agora to querendo fazer é o seguinte:
Pegar dois arquivos com várias linhas(cominações numéricas), e compara-los; a primeira linha do primeiro arquivo como todas do segundo, depois a segunda linha do primeiro com todas do segundo etc. Conforme ele termina de comparar uma linha do primeiro ele vai montando uma nova linha com os números que ele venha a encontrar e assim gerar um terceiro arquivo com várias linhas.
Mas uma vez obrigado pela sua boa vontade em me ajudar. Vou testar o código e posto o resultado, mas acho que pelo o que vc falou que fez vai dar certo, vou adaptar ao que tenho e ver o acontece.
Na lógica anterior que vc me ajudou eu estava pegando um arquivo com várias linhas e comparando todas elas, agora to querendo fazer é o seguinte:
Pegar dois arquivos com várias linhas(cominações numéricas), e compara-los; a primeira linha do primeiro arquivo como todas do segundo, depois a segunda linha do primeiro com todas do segundo etc. Conforme ele termina de comparar uma linha do primeiro ele vai montando uma nova linha com os números que ele venha a encontrar e assim gerar um terceiro arquivo com várias linhas.
GOSTEI 0
Pedro
27/10/2014
Então rrubinho, esta lógica funcionou 95% rsrs. Veja só:
1º arquivo
,1,2,3,4,5,6,7,8,9,10,
,11,12,13,14,15,16,17,18,19,20,
etc...
2º arquivo
,33,44,1,7,16,40,14,42,43,10,
,10,31,32,34,45,47,17,50,51,
etc...
Resultado deve ser separado:
1,7,10 (repetidos existentes na 1ª combinação do 1º arquivo)
14,17 (repetidos existentes na 2ª combinação do 1º arquivo)
etc...
Só que eu só consigo fazer retornar tudo junto e sempre repete um número caso ele apareça em mais de uma combinação. Está retornando desse jeito:
1,7,10,10,14,17
Tudo mesma linha e repete por exemplo o 10 que não poderia repetir pelo numero de ocorrências, mas apenas retornara caso repita independente das vezes.
1º arquivo
,1,2,3,4,5,6,7,8,9,10,
,11,12,13,14,15,16,17,18,19,20,
etc...
2º arquivo
,33,44,1,7,16,40,14,42,43,10,
,10,31,32,34,45,47,17,50,51,
etc...
Resultado deve ser separado:
1,7,10 (repetidos existentes na 1ª combinação do 1º arquivo)
14,17 (repetidos existentes na 2ª combinação do 1º arquivo)
etc...
Só que eu só consigo fazer retornar tudo junto e sempre repete um número caso ele apareça em mais de uma combinação. Está retornando desse jeito:
1,7,10,10,14,17
Tudo mesma linha e repete por exemplo o 10 que não poderia repetir pelo numero de ocorrências, mas apenas retornara caso repita independente das vezes.
GOSTEI 0
Renato Rubinho
27/10/2014
Coloca uma validação para, caso o número já estiver no retorno, não grava novamente.
GOSTEI 0
Pedro
27/10/2014
A questão de exibir cada combinação em uma linha, eu resolvi atribuindo vazio a variável logo após escrever cada linha no novo arquivo:
sResult := ' ';
Vou ver aqui se consigo agora validar e posto o resultado.
sResult := ' ';
Vou ver aqui se consigo agora validar e posto o resultado.
GOSTEI 0
Pedro
27/10/2014
rrubinho,
Consegui validar dessa forma:
Fica bom assim ou ficou tipo gambiarra?
Consegui validar dessa forma:
if sNum1 = sNum2 then
begin
iPos := Pos(sNum2, sResult);
if iPos = 0 then
sResult := sResult + sNum2 + ' ';
end;Fica bom assim ou ficou tipo gambiarra?
GOSTEI 0
Renato Rubinho
27/10/2014
Buenos,
Acho que essa validação é normal, não uma gambiarra... rsrs
Mas tem uma falha, caso eventualmente você encontre números inferiores a um número que já conste no sResult
Neste exemplo (10,15,20,30), caso você já tenha estes números encontrados e encontrar o 0, o Pos() irá acusar que no seu resultado já existe o 0 no 10, no 20 e no 30, se encontrar o 1, acusará por causa do 10 e do 15, etc.
Situações assim, coloco sempre todos os números com um separador (a vírgula, no seu caso), mas adiciono uma vírgula no começo e uma no final para todos os números, inclusive o primeiro e o último, possuírem um separador antes e um depois, com certeza. No Pos(), faço a verificação inclusive com o separador, evitando números contidos em outros números
Acho que essa validação é normal, não uma gambiarra... rsrs
Mas tem uma falha, caso eventualmente você encontre números inferiores a um número que já conste no sResult
Neste exemplo (10,15,20,30), caso você já tenha estes números encontrados e encontrar o 0, o Pos() irá acusar que no seu resultado já existe o 0 no 10, no 20 e no 30, se encontrar o 1, acusará por causa do 10 e do 15, etc.
Situações assim, coloco sempre todos os números com um separador (a vírgula, no seu caso), mas adiciono uma vírgula no começo e uma no final para todos os números, inclusive o primeiro e o último, possuírem um separador antes e um depois, com certeza. No Pos(), faço a verificação inclusive com o separador, evitando números contidos em outros números
// Exemplo de Result Atual: ,10,15,20,30,
if sNum1 = sNum2 then
begin
iPos := Pos(',' + sNum2 + ',', sResult);
if iPos = 0 then
sResult := sResult + sNum2 + ',';
end;
GOSTEI 0
Pedro
27/10/2014
Entendi.
Eu não havia pensado nisso, mas no caso a função POS não encontra exatamente o que for solicitado? tipo até porque se eu colocar "A" ele não vai encontrar a primeira ocorrência para "a". Então imaginei que se eu quiser saber se o "10" já existe ele não vai confundir com o primeiro "1" ou "0" que aparecer.
Vou testar o que você citou e posto mais tarde o resultado.
Eu não havia pensado nisso, mas no caso a função POS não encontra exatamente o que for solicitado? tipo até porque se eu colocar "A" ele não vai encontrar a primeira ocorrência para "a". Então imaginei que se eu quiser saber se o "10" já existe ele não vai confundir com o primeiro "1" ou "0" que aparecer.
Vou testar o que você citou e posto mais tarde o resultado.
GOSTEI 0
Pedro
27/10/2014
Entendi.
Eu não havia pensado nisso, mas no caso a função POS não encontra exatamente o que for solicitado? tipo até porque se eu colocar "A" ele não vai encontrar a primeira ocorrência para "a". Então imaginei que se eu quiser saber se o "10" já existe ele não vai confundir com o primeiro "1" ou "0" que aparecer.
Vou testar o que você citou e posto mais tarde o resultado.
Eu não havia pensado nisso, mas no caso a função POS não encontra exatamente o que for solicitado? tipo até porque se eu colocar "A" ele não vai encontrar a primeira ocorrência para "a". Então imaginei que se eu quiser saber se o "10" já existe ele não vai confundir com o primeiro "1" ou "0" que aparecer.
Vou testar o que você citou e posto mais tarde o resultado.
Testei aqui conforme você citou e realmente você está correto ele não encontra o "0" na combinação, só que a validação em si deixa de funcionar e volta ao que estava antes; ele repete o número que já havia sido encontrado antes.
ex. ,10,15,20,10,30,
Ele encontrou o 10 em outra combinação, então não precisava repeti-lo. A forma que eu coloquei resolvia esse problema mas tem a falha que você citou. Então o método de usar "," no início e fim resolve, mas anula a validação permitindo que números sejam repetidos.
Por que será? Vou fazer uns testes aqui.
GOSTEI 0
Renato Rubinho
27/10/2014
Você utilizou o código que passei?
Com ele não deveria falhar.
Exemplo:
Com ele não deveria falhar.
Exemplo:
sResult := ',10,15,20,10,30,';
sNum1 := '10';
sNum2 := '10';
if sNum1 = sNum2 then
begin
iPos := Pos(',' + sNum2 + ',', sResult); // iPos := Pos(',10,', ',10,15,20,10,30,'); >> iPos = 1;
if iPos = 0 then
sResult := sResult + sNum2 + ',';
end;
GOSTEI 0
Pedro
27/10/2014
Sim, exatamente igual. Resolve o problema que você mencionou, mas deixa de validar se o número já existe na variável sResult.
GOSTEI 0
Renato Rubinho
27/10/2014
Pedro,
Não sei o que está fazendo de errado.
O código que passei, detalhado, mostra que funciona a verificação.
Debuga e veja se não tem algo de errado nas suas variáveis.
Não sei o que está fazendo de errado.
O código que passei, detalhado, mostra que funciona a verificação.
Debuga e veja se não tem algo de errado nas suas variáveis.
GOSTEI 0
Pedro
27/10/2014
Você utilizou o código que passei?
Com ele não deveria falhar.
Exemplo:
Com ele não deveria falhar.
Exemplo:
sResult := ',10,15,20,10,30,';
sNum1 := '10';
sNum2 := '10';
if sNum1 = sNum2 then
begin
iPos := Pos(',' + sNum2 + ',', sResult); // iPos := Pos(',10,', ',10,15,20,10,30,'); >> iPos = 1;
if iPos = 0 then
sResult := sResult + sNum2 + ',';
end;
rrubinho, como vai?
Estive ausente esses dias e nem postei aqui o resultado.
Então, realmente essa faz com que aceite certos números, mas a validação que eu havia feito deixa de funcionar. Depois de um testes percebi que se algum número de 1 a 9 fosse encontrado, aconteceria a falha que você falou, mas se esses números vierem precedidos de "0" o erro não acontece, e a minha validação continua funcionando e não precisa usar esse último código que você postou.
Então para resolver eu criei uma rotina caso encontre 1,2,3,4,5,6,7,8 ou 9, reescreva o arquivo colocando 01,02,03 etc e depois disso faça a leitura/comparação e deu certo.
Quebrei cabeça demais, mas com a sua ajuda consegui.
GOSTEI 0