Ao snipes e interessados: Extrair de txt numeros pares e ímp

11/12/2003

1

Oi, snipes,

estou enviando igualmente estas linhas para o fórum , pois tenho a pretensão de que possa ser útil para mais alguém. Só não sei se vão publicar, pois é muito longo.
A sua mensagem inicial era:

´ 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? snipes ´

********************* (resposta) ********************



{ Delphi 6. Pentium III, 1 GHz, 128 Mb.
Conteúdo do único arquivo do programa (Numeros.txt), que eu testei no início:

5 17 33 47 9 18 7 6 11 10 2 4 14 3 84
3 6 12 7 15 4 10 13 54 22 1 9 17 29 49
2 4 6 8 10 12 14 16 1 3 5 7 9 11 13
1 3 5 7 9 11 13 15 4 6 8 10 12 14 16
13 25 3 65 49 2 5 11 16 30 81 52 3 6 7
14 17 5 33 20 1 9 16 18 21 49 2 27 40 4

Observe que se um número (por exemplo 4) estiver gravado no txt como 04, 0004,
00000000004... não influirá no resultado do processamento.

Se vc quiser que as linhas geradas no txt sejam sempre as mesmas, retire a
procedure ´randomize();´ do evento formcreate e coloque-a logo abaixo do begin
do button2.click. (A procedure randomize() NÃO gera números aleatórios, apenas
faz parecer que são aleatórios (randômicos).)

Na listbox eu só consegui adicionar uma 10.000 linhas. Mais do que isso acho
que é possível, mas acho que teria que alterar diretivas de compilação ou usar
algum outro recurso do Delphi/Pascal, C, etc... Tente com os moderadores (seja
específico no título da mensagem).
Para economizar recursos e melhorar a velocidade de processamento, vc pode
criar um aplicativo de console (o próprio Delphi permite isso).

Para gerar as 10 mil linhas meu micro demorou pouco mais que 2 segundos. Mas
para adicionar 100 mil linhas pode levar muito mais que 10 vezes esse tempo.

Para exibir na listbox as linhas com 7 (ou 8) números pares, é quase instantâneo.

Caso vc já receba o arquivo txt pronto, e com outra estrutura, possivelmente
terá que alterar o código. Nesse caso, envie o txt com umas 30 linhas para mim.

Eu rodei o exemplo e funcionou beleza. Tente entender cada linha, altere alguma
coisa (faça cópia do original antes) e compare os resultados. Você mesmo vai
acabar descobrindo maneiras elegantes e mais eficazes de resolver isso. Nesse
caso, gostaria de receber as dicas. Divirta-se com esse ´quebra-galho´. carlosrm.

Se vc já tem o txt com os números, pode simplesmente eliminar o button2.
Só precisará trocar a linha AssignFile(F, ´C:\........´); preenchendo com o
nome e extensão do seu arquivo, mais o caminho completo. Exclua também a
linha ´randomize();´ do evento formcreate.
}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Button1: TButton;
ListBox1: TListBox;
Label1: TLabel;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
max_par, max_impar : byte;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
combobox1.ItemIndex := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
n, p, i : byte;
linha : string;
begin
Case combobox1.ItemIndex of
0: begin
max_par := 7;
max_impar := 8;
label1.caption := ´7 pares e 8 ímpares.´;
end;
1: begin
max_par := 8;
max_impar := 7;
label1.caption := ´8 pares e 7 ímpares.´;
end;
End;
listbox1.Items.Clear;
AssignFile(F,´C:\Meuspas\SnipesTxt\Numeros.txt´); //use o path e nome do seu txt
Reset(F);
p := 0;
i := 0;
while not eof(F) do begin
readln(F, linha);
for n := 1 to length(linha) do begin
if (linha[n] = ´ ´) then // #32
if (linha[n -1] in [´0´, ´2´, ´4´, ´6´, ´8´]) then begin
inc(p);
end
else begin
inc(i);
end
else if (n = length(linha)) then begin
if (linha[n] in [´0´, ´2´, ´4´, ´6´, ´8´]) then begin
inc(p);
break;
end
else begin
inc(i);
break;
end;
end;
end; // for...

if (p = max_par) or (i = max_impar) then
listbox1.items.add(linha);

p := 0; i := 0;
end; // while not...
closefile(F);
label1.caption := label1.caption + ´ Total de linhas: ´+inttostr(listbox1.Items.Count);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
listbox1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
F : TextFile;
i, j : Integer;
linha : string;
time1, time2 : TTime;
begin
Setcursorpos((screen.width div 2),(screen.height div 2)+20);
screen.Cursor := crHourGlass;
listbox1.clear;

time1 := now();
AssignFile(F,´C:\Meuspas\SnipesTxt\Numeros.txt´);
Rewrite(F);
for i := 1 to 10000 do begin
linha := ´ ´;
for j := 1 to 15 do
linha := linha + inttostr(random(99))+´ ´;

Append(F);
Writeln(F, linha);
listbox1.Items.add(linha);
end; // for i...
Closefile(F);
time2 := now();
screen.Cursor := crDefault;
showmessage(´Demorou (h:m:s:ms): ´+formatDateTime(´hh:nn:ss:zzzz´, time2 - time1));
label1.caption := ´Total de linhas := ´+inttostr(listbox1.Items.count);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize();
end;

end.

******** fim ***********


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