[SP-pm] ER para separar o primeiro e o último campo de um registro.

Wagner Arbex arbex at arbex.pro.br
Mon Dec 22 12:04:39 PST 2008


Prezados... antes de tudo, agradeço a todos, pois as soluções propostas
foram uma verdadeira aula e todas as soluções resolviam o meu prob - até
a que eu mesmo sugeri, no segundo email :) basta eu achar a melhor.

Qto as indicações de leitura, mais uma vez, obrigado... já estavam no
meu "bookmark de cabeceira" e eu tenho consultado diariamente.

[]s e obrigado.

On 12/22/2008 04:01 PM, Andre Carneiro wrote:
> 
> 
> 2008/12/22 Wagner Arbex <arbex at arbex.pro.br <mailto:arbex at arbex.pro.br>>
> 
>     Prezados Monges... estou com um pequeno prob com ERs e tenho certeza de
>     que é trivial, mas agarrei.
> 
>     Vou dar um exemplo simplificado. Tenho um arquivo com vários registro
>     que pode ser, por ex:
> 
>     1         ABC X Y CDA 40
>     5         XYZ - U BBB  0
>     8         --- T C CTT 80
> 
>     E gostaria de gravar um arquivo com:
> 
>     1,40
>     5,0
>     8,80
> 
> 
> Não entendi o objetivo aqui. Se puder ser mais claro seria bom.
>  
> 
> 
>     O que eu preciso é ler esse arquivo e separar o primeiro e o último
>     campo para gravá-los em outro arquivo, seria +-
> 
> 
> Pois é, o texto em cima eu entendi, mas não entendi o seu exemplo...
> está meio estranho. O que você precisa separar dentro do arquivo
> exatamente. Dê um exemplo real, se possível.
> 
> Quanto a ER, você precisa identificar o que está separando o primeiro e
> o último caracter, por exemplo, suponha que a entrada seja algo assim:
> 
> <arquivo_fictício>
> campo1 campo2
> </arquivo_fictício>
> 
> O que é separado aqui é o espaço. Se eu quiser usar expressões regulares
> para separar isso e guardar em duas variáveis, eu poderia fazer assim,
> por exemplo:
> 
> <code>
> 
> 
> use strict;
> open my $fh,'<','caminho_para/meuarquivo.txt' or die $!; #Apenas
> didático. Não se deve tratar esse tipo de erro com die.
> while(<$fh>){
>          my $linha = $_;#Evite trabalhar com $_ diretamente, a menos que
> você saiba exatamente o que você está fazendo. Toda a vez que o while
> iterar, $_ conterá uma nova linha do arquivo, então preste atenção para
> não sobrescrever valores em variáveis ou algo do tipo.
> 
>          chomp $linha; #Remove o terminador do final da string(se houver)
> 
>          my ($campo1,$campo2) = split /\ +/,$linha;# split é uma função
> nativa de perl, que faz com que tudo o que está antes e depois do
> padrão(nesse caso, o padrão é um espaço ou '+'),  seja separado em uma
> lista. No caso, a minha lista compreende o agrupamento(os parênteses)
> das variáveis $campo1 e $campo2.
> 
>          print "\n\nCAMPO1: $campo1\nCAMPO2: $campo2";#imprime o resultado.
> }
> close $fh;
> 
> __END__;
> </code>
> 
> 
> Existem várias outras formas de fazer, Se você não entendeu, ou se eu
> não entendi o seu problema, volte a postar por aqui.
> 
> 
> 
>     while ( <ARQ1> ) {
>       chomp;
> 
>       my $primeiro = $_;
> 
> 
>  
> 
>       $primeiro =~ s/\s.*//;  # OK... esse funciona.
> 
> 
>       my $ultimo = $_;
> 
> 
> Cuidado com a confusão aqui. Você está atribuindo sempre o mesmo valor
> para $primeiro e $ultimo. É isso mesmo que você quer? Se não for, pense
> no que eu disse sobre trabalhar diretamente com '$_'.
>  
> 
> 
>       $ultimo =~ s/.*\s.+$//; # Bom, aqui eu não sei qual a ER a ser usada.
> 
> 
> Eu também não, simplesmente porque não estou entendendo o que você quer
> na verdade. Essa ER aí em cima simplesmente vai anular qualquer valor
> que esteja em '$ultimo', substituindo tudo, inclusive o último espaço no
> final da linha, por nada. Se você queria substituir todos os espaços por
> nada, poderia usar:  s/\ +$//;    ou    s/\s+$//;
>  
> 
> 
>       print ARQ2 "$primeiro,$ultimo\n";
>     }
> 
>     Além de me ajudarem com a ER, todas as sugestões para eu melhorar o
>     código, conhecer novas estruturas, formas de fazer etc são muito bem
>     vindas.
> 
> 
> E eu recomendo que você comece lendo isso aqui:
> http://perl.org.br/Perldoc/V500807/Perlintro
> 
> 
> 
>  
> Qualquer dúvida poste aqui.
> 
> 
> Cheers!
> 
> 
>     []s e, desde já, obrigado.
>     --
>       Wagner Arbex
>       Doutorando em Engenharia de Sistemas e Computacao - COPPE/UFRJ
> 
>       Vendo notebook - http://www.arbex.pro.br/
> 
>     _______________________________________________
>     SaoPaulo-pm mailing list
>     SaoPaulo-pm at pm.org <mailto:SaoPaulo-pm at pm.org>
>     http://mail.pm.org/mailman/listinfo/saopaulo-pm
> 
> 
> 
> 
> -- 
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm


-- 
   Wagner Arbex
   Doutorando em Engenharia de Sistemas e Computacao - COPPE/UFRJ

   Vendo notebook - http://www.arbex.pro.br/



More information about the SaoPaulo-pm mailing list