Selecionar linhas e jogar em uma listbox

09/12/2003

1

tenho um txt no seguinte formato

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 18

são 100.000 linhas contendo apenas 15 numeros por linhas.

gostaria de uma ajuda, quero ler este txt do seguinte modo, tenho uma combo com os seguintes itens

7p e 8i
8p e 7i

quando eu selecionar a 1 opção 7p e 8i quero que ele leia o txt e selecione apenas as linhas que existem 7 numeros pares e 8 impares e jogue esta linha em uma listbox.
Alguem pode me ajudar?


Responder

Posts

Primeiro vc vai ter q ler linha por linha desse texto. Depois vc tem q passar o valor da linha para uma string e analise-a da seguinte forma:

Vamos supor que esses números estejam separados por uma vírgula. Vc Use a função StrToken para ler numero por numero.

Ex: NUMERO := StrToken(TEXTO, ´,´ , 21) - primeiro parametro o texto que vai ser analisado, segundo o caracter separador, e terceiro é o numero do caracter separador, no caso a 21ª vírgula encontrada. Ele vai copiar todo o texto anterior a essa vírgula até a vírgula anterior.

se vc tem o texto ´usuario,senha,relatorio´ e usar essa função com o 3° parametro valendo 2 ele vai te retornar ´senha´.

depois que receber esse texto numa variavel vc verifica se é impar ou par... ai vc pode fazer um contador contando os numeros impares ou pares e caso for a combinação que te interessa vc adiciona no seu combo.

o problema disso é q vc vai ter q analisar linha por linha e numero por numero se é impar ou par... Talvez fique muito lento...


Responder

10/12/2003

Carlosrm

snipes, aproveitando as sugestões do daniel, apresento uma pequena variação que pode te ajudar a encontrar uma solução adequada.

Primeiro, crie duas variáveis tipo byte, inicilaizadas em zero. Por exemplo, var contpar, contimpar : byte;
Vc terá que percorrer o arquivo.txt linha por linha, conforme disse o daniel.
Começando na primeira linha do arquivo.txt, vc deverá percorrer cada caractere da linha, procurando pelo separador de cada um dos 15 numeros (pode ter sido usado espaço, vírgula, ponto e vírgula, aspas...etc.).
A cada separador que encontrar, deverá ´voltar´ um caractere para testá-lo se o número anterior ao espaço é par ou ímpar. Basta testar o último dígito, como caractere (alfabético ou literal) mesmo: se o dígito anterior ao separador for 0, 2, 4, 6, 8, então este número é par. Basta incrementar a variável contpar. Senão, incremente a variável contimpar.
E assim sucessivamente, até chegar no último caracter da linha. Claro que neste caso, não deverá ´voltar´ um caractere... Mais ou menos assim:

- - -
For I := 1 to length(linha) do begin
if linha[I] = ´;´ then
if (linha[I -1] in [´0´, ´2´, ´4´, ´6´, ´8´]) then
inc(contpar)
else
inc(contImpar);

if (I = length(linha)) then
if (linha[I] in [´0´, ´2´, ´4´, ´6´, ´8´]) then
inc(contpar)
else
inc(contImpar);
end;

Agora vc já sabe quantos números pares e ímpares tem nessa linha. Se atender ao critério estabelecido, é só adicionar no combobox.
Quando passar para a linha seguinte, não esqueça de zerar as duas variáveis.
Isso é um esboço rudimentar. Há outras formas mais eficientes de se fazer as mesmas coisas.
Sempre há muitas soluções possíveis. E conforme já levantado pelo Daniel, a velocidade pode ser um problema. Se a velocidade for de extrema importância, outras pessoas poderão te auxiliar melhor. Um código com menos linhas nem sempre é o de processamento mais rápido, principalmente quando os volumes a processar são consideráveis.
carlosrm :)


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira