[Cascavel-pm] Balance Line
Diogo Galvao
diogo86 em gmail.com
Quarta Abril 21 06:59:39 PDT 2010
Leonardo,
se o problema com arquivos grandes está em carregá-lo todo no array,
você pode fazer a leitura linha a linha, como você faz com o primeiro
arquivo.
Seguindo o seu código, remova a leitura no array e deixe o loop assim:
while ( defined(my $linha = <FILE1>) && defined(my $compara = <FILE2>) ) {
// ...
}
Onde você estava utilizando $_, passe a utilizar $linha, e o $compara
já vai ser a linha do FILE2 a cada iteração.
Se for utilizar o FILE2 várias vezes, você pode fazer seek(FILE2, 0,
0) pra retornar ao início do arquivo e poder utilizá-lo novamente.
E vale lembrar que assim que um dos arquivos terminar, a iteração acaba.
Diogo
2010/4/21 Leonardo Gerheim <general_andrade em yahoo.com.br>:
> Olá pessoal; * Sou iniciante em Perl
>
> Já construi uma aplicação que atendia nossas nessecidades, entretanto os
> arquivos para análise ficaram maiores e a aplicação passou a não mais
> satisfazer, vou explicar. O motivo é porque a aplicação para fazer as
> comparações e contagens usava como base arquivos de Kb e Mb no máximo, hoje
> trabalhamos com arquivos muito maiores.
> O que preciso é fazer um balance line, pois ele vai ler o arquivo uma
> única vez, diferentemente da aplicação que desenvolvi que lia o arquivo
> muitas vezes.
> Funciona assim, tenho dois arquivos ordenados, um com 3 colunas(arquivo
> de análise), ele possui várias linhas com a primeira coluna igual e o
> segundo arquivo(arquivo de comparação) que possui uma coluna apenas com uma
> incidência apenas da coluna do primeiro arquivo.
> Então eu leio cada linha de ambos os arquivos e comparo, caso sejam
> iguais eu conto os valores das colunas 2 e 3 do arquivo1, caso diferentes eu
> pego a próxima linha do arquivo de comparação.
> O código da função responsável por essa parte está assim após essa
> alterção que expliquei que preciso fazer, mas não funciona. Alguém pode me
> dar uma luz?
>
> Abraço.
>
> sub Alel_A{
>
> $contCol1=0;
> $contCol2=0;
>
> open(FILE1,$ARGV[1]); #Arquivo que será analisados
> open(FILE2,$ARGV[0]); # Arquivo para comparação
> @file2=<FILE2>; #usei um vetor para usar o shift
>
> $compara=shift(@file2);
> chop $snp;
>
> while (<FILE1>){
> if($_ =~ m/$compara/){
> $contCol1++ if $_ =~ m/A\s*A/;
> $ContCol2++ if $_ =~ m/A\s*B/;
> }elsif($_ !=~ m/$compara/){
> $snp=shift(@file2);
> chop $compara;
> }
>
> }
>
> print "TENHO UMA FUNÇÃO QUE CALCULA A FREQUENCIA DESSAS INCIDÊNCIAS
> AQUI";
>
> }
>
> O algoritmo seria mais ou menos isso que tenho em mente, mas não
> consegui êxito.
>
> abrir arquivo_a
>
> abrir arquivo_b
>
>
>
> ler registro_a
>
> ler registro_b
>
>
>
> enquanto (não fim_arquivo_a) e (não fim_arquivo_b)
>
> se (chave_a = chave_b)
>
> processa registros
>
> ler registro_b
>
> senão se (chave_a < chave_b)
>
> ler registro_a
>
> senão
>
> ler registro_b
>
> fim_se
>
> fim_se
>
> fim_enquanto
>
>
>
> fechar arquivo_a
>
> fechar arquivo_b
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
Mais detalhes sobre a lista de discussão Cascavel-pm