[Cascavel-pm] Res: Res: Acesso aleatório à arquivos

Eden Cardim edencardim em gmail.com
Terça Fevereiro 22 07:53:53 PST 2011


>>>>> "Leonardo" == Leonardo Gerheim <general_andrade em yahoo.com.br> writes:

    Leonardo> A resposta do Fernando foi muito d+, Show de bola mesmo.
    Leonardo>     Mas devido a forma que chegou o email para vocês, acho que não entenderam como deveria ser a disposição das notas na saída, porque dessa forma que vocês
    Leonardo> fizeram eu também fiz, não tão impressionantemente em uma linha.
    Leonardo>     A disposição das notas dever ser a nota A (NEGRITO) em cima na nota B (NORMAL) assim:

    Leonardo> INPUT:

    Leonardo> joao,1,1
    Leonardo> joao,2,1
    Leonardo> joao,1,2
    Leonardo> maria,1,1
    Leonardo> maria,2,1
    Leonardo> maria,1,2

    Leonardo> OUTPUT:

    Leonardo> joao => 1,2,1
    Leonardo>             1,1,2

    Leonardo> maria => 1,2,1
    Leonardo>               1,1,2

    Leonardo>     Entenderam? Por isso perguntei como faria para avançar e recuar uma linha.
    Leonardo>     Vlw pela força até agora.


Não precisa recuar nem avançar a leitura, você só precisa transpor a
matriz depois de parsear tudo. Sempre evite fazer acesso aleatório nesse
caso, é *muito lento*. Um banco de dados faria uma primeira passagem,
acumulando tudo num arquivo temporário e depois faria uma segunda
passagem nesse arquivo, fazendo a transposição.  Espero que você esteja
fazendo esse parse com o intuito de popular um banco de dados :)

de qualquer forma:

--8<-[ test.pl ]--cut here---------------start------------->8----
use warnings;
use strict;
use Data::Dump;

my %alunos;
while (<>) {
    chomp;
    my($aluno, @notas) = split /,/, $_;
    my $tabela = $alunos{$aluno} //= [];
    push @$tabela, \@notas;
}
my %transposta;
foreach my $aluno (keys %alunos) {
    my $registros = $alunos{$aluno};
    for my $i (0..@$registros-1) {
        my $linha = $registros->[$i];
        for my $j (0..@$linha-1) {
            $transposta{$aluno}[$j][$i] = $alunos{$aluno}[$i][$j];
        }
    }
}

for my $aluno (keys %transposta) {
    print $aluno, ' => ';
    my $registros = $transposta{$aluno};
    my $pad = 0;
    for my $linha (@$registros) {
        print ' ' x (length($aluno) + length(' => ')) if $pad++;
        print join(', ', @$linha), "\n";
    }
}
--8<---------------cut here---------------end--------------->8---
,----[ cat test_data ]
| joao,10,15
| joao,10,10
| joao,8,9
| maria,7,9
| maria,6,9
| maria,4,10
`----
,----[ perl test.pl test_data ]
| joao => 10, 10, 8
|         15, 10, 9
| maria => 7, 6, 4
|          9, 9, 10
`----

-- 
Eden Cardim
Software Engineer
+55 73 9986-3963
edencardim.com


Mais detalhes sobre a lista de discussão Cascavel-pm