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

Renato Santos renato.cron em gmail.com
Terça Fevereiro 22 05:14:27 PST 2011


Olá,

Veja se o exemplo lhe serve:


use strict;
use warnings;

my $nomes = {};

open(my $fh, '<', $ARGV[0]);

while (my $linha = <$fh>){
 # pega letra seguida de qualquer coisa, até o final. Note que se sempre for
separado por virgula, vc pode dar split
 my ($nome, $notas) = $linha =~ /(\w[^,]*)\,(.+)/;

 # note que talvez seja necessario tratamentos no nome, como UpperCase,
trim, acentos, etc..
 $nome = uc $nome;

 $nomes->{$nome} = $nomes->{$nome} ? "$nomes->{$nome},$notas" : $notas;
 # vc tambem poderia usar um push, e antes separar o valor de "notas" por
virgula tambem
}

print $_ . ' => ' . $nomes->{$_} . "\n" foreach (sort keys %$nomes);


Dentro do código, dou sugestões, como por exemplo, usar uma array ou um
split. Mas ai fica a sua escolha.

Veja o resultado deste perl com a entrada que você mandou:

JOAO => 10,15,10,10,8,9
MARIA => 7,9,6,9,4,10



2011/2/22 Leonardo Gerheim <general_andrade em yahoo.com.br>

>     Agradeço à todos pelas respostas. Mas realmente não consegui me
> expressar, como coloquei um exemplo não específico ficou realmente
> complicado o entendimento. A minha intenção é a seguinte:
>     Eu quero poder movimentar dentro do arquivo, ou seja, avançar e recuar
> uma uma linha do arquivo.
>
> ex de INPUT:
>
> joao,10,15
> joao,10,10
> joao,8,9
> maria,7,9
> maria,6,9
> maria,4,10
>
> onde temos respectivamente o nome do aluno a nota A e a nota B, mas
> queremos gerar um OUTPUT:
>
> joao 10,10,8
>        15,10,9
> maria 7,6,4
>          9,9,10
>
>
> Ou seja, uma nota após a outra.
>
>     Para isso, pensei em ler a primeira linha, imprimir as notas notas uma
> embaixo da outra, logoa após isso teria que retornar à primneira linha para
> imprimir o segundo conjunto de notas, enquanto o nome do aluno for o mesmo.
> O que não consegui fazer é essa parte de movimentar dentro do arquivo,
> avançando e recuando em arquivos que tenham registros de tamanho diferente.
>     Caso existe um algoritmo mais simples por for me ajudem a montá-lo, mas
> de qualquer forma me expliquei como avançar e recuar linhas.
>
> Att.
>
> P.S: A solução do Eden na sua última resposta resolveu a última questão, eu
> que me expressei totalmente mal.
>
>
>
>
> ------------------------------
> *De:* Eden Cardim <edencardim em gmail.com>
> *Para:* Cascavel Perl Mongers <cascavel-pm em pm.org>
> *Enviadas:* Terça-feira, 22 de Fevereiro de 2011 9:04:35
> *Assunto:* Re: [Cascavel-pm] Acesso aleatório à arquivos
>
> >>>>> "Leonardo" == Leonardo Gerheim <general_andrade em yahoo.com.br>
> writes:
>
>     Leonardo> Olá pessoal, Preciso ler um arquivo e quando em uma
>     Leonardo> determinada linha contiver um valor, ele pular para a
>     Leonardo> próxima linha e quando encontrar um segundo valor não
>     Leonardo> imprimir mais nada, como no exemplo abaixo:
>
> Não ficou claro o que você quer aqui, mostra um exemplo da entrada e da
> saída esperada.
>
>     Leonardo> joao- não imprimir
>     Leonardo> maria- não imprimir
>     Leonardo> antonio- não imprimir
>     Leonardo> a- não imprimir
>     Leonardo> linguagem- IMPRIMIR
>     Leonardo> programacao- IMPRIMIR
>     Leonardo> b- não imprimir
>     Leonardo> elizabeth- não imprimir
>     Leonardo> kenia- não imprimir
>
> Isso é a entrada ou a saída do programa?
> grep não resolve?
> ,----[ cat test_data ]
> | joao
> | maria
> | antonio
> | a
> | linguagem
> | programacao
> | b
> | elizabeth
> | kenia
> `----
> ,----[ cat test_data | grep "linguagem\|programacao" ]
> | linguagem
> | programacao
> `----
>
>     Leonardo>    Eu consegui fazer um script para isso, entretanto
>     Leonardo> somente consegui que ele funcione, quando o amanho dos
>     Leonardo> registros são iguais. Como faço para resolver esse
>     Leonardo> problema tendo um arquivo com registros de tamnho
>     Leonardo> diferente?
>
> Se você mostrar o código, com um exemplo da execução, fica mais fácil te
> ajudar.
>
> --
> Eden Cardim
> Software Engineer
> +55 73 9986-3963
> edencardim.com
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
Renato Santos
http://www.renatocron.com/blog/
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20110222/2b0cae09/attachment-0001.html>


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