[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