[Cascavel-pm] Separando campos

Adriano Ferreira a.r.ferreira em gmail.com
Segunda Março 19 09:46:20 PDT 2007


On 3/19/07, Gabriel Vieira <gabriel.vieira em gmail.com> wrote:
> ---------------------------------->8----------------------------------
> $endereco = "R MARGARIDAS 13 QD8 C 13";
> $endereco = "AV 29 JUNHO 00602";
> print "Tipo: $1\nRua: $2\nNúmero: $4\nComplemento: $6" if $endereco =~
> /^(\w+)\s+((\s|\w)+?)\s+(\d+)(\s+((\s|\w)+))?$/;
>
> # Tipo: R
> # Rua: MARGARIDAS
> # Número: 13
> # Complemento: QD8 C 13
>
> # e
>
> # Tipo: AV
> # Rua: AV 29 JUNHO
> # Número: 00602
> # Complemento:
> ----------------------------------8<----------------------------------
>
> Funcionou blz aqui :)

Bravo, Gabriel! Para enfeiar a sua solução perfeita, vai uma reescrita
dela conforme Perl Best Practices. Vale lembrar algumas das regras
aplicadas aqui:

1. Não use $1, $2, mas @groups = $a =~ /re/ para dar imediatamente
nomes significativos às partes capturadas da regex
2. Não use grupos que capturam () quando você não quer alguns destes
resultados. Use (?:)
3. Comentários são seus amigos e regexes podem ser comentadas quando o
modificador \x é usado.

e neste caso, eu preferi usar um hash a algo como

($tipo, $logradouro, $numero, $complemento)

para ser mais geral ainda.

Funcionou também, mas só por causa da sua solução original.

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @enderecos = (
            "R MARGARIDAS 13 QD8 C 13",
            "AV 29 JUNHO 00602"
);
my @fields = qw(tipo logradouro numero complemento);
for my $e (@enderecos) {
    my %endereco;
    print "$e\n";

    if (@endereco{@fields} = $e =~ /\A
                                      (\w+)          # tipo: R, AV
                                      \s+
                                      (\w[\s\w]*?)   # logradouro
                                      \s+
                                      (\d+)          # número
                                      (?:            # talvez seguido por
                                         \s+
                                         ( [\s\w]+ ) # complemento
                                      )?
                                      \z
                                   /gmx) {
        print Dumper \%endereco;
    }

}




>
> On 3/19/07, Veronica Soraia <veronica.soara em gmail.com> wrote:
> > olá tenho um problema , não estou conseguindo resolver (sou iniciante
> > rsrsr), é o seguinte, tenho um arquivo q vem com o endereço junto com
> > essas duas opções : AV 29 JUNHO 00602, e , R MARGARIDAS 13 QD8 C 13.
> > Tenho que separar esses  registros em campos como Endereço,numero,
> > complemento com o algoritmo q fiz no segundo registro ele pega normal:
> > Endereço : R MARGARIDAS , numero:13, complemento: C 13 . Mas no
> > primeiro registro ele pega o "29" tratando como numero e o "JUNHO
> > 00602" tratando como complemento , ou seja ele só pega o AV como
> > endereço,o correto seria Endereço:AV 29 junho e numero :00602.Para
> > todos os casos com numero após um logradouro ele não filtra certo.
> >
> > Alguem pode me ajudar ! :-) o algoritmo q fiz é esse :
> >
> > {
> >         @locendtemp     =       split(/\s/,$_);
> >
> >         $n      =       0;
> >
> >         foreach $campo(@locendtemp)
> >         {
> >                 $campo  =       strtrim($campo);
> >
> >                 if($n == 0)
> >                 {
> >                         $locend =       $campo."  ";        #pega endereço
> >                 }
> >                 elsif (($campo !~ /\d/) and (not $locnum))
> >                 {
> >                         $locend .=      $campo." ";         #endereço
> >                 }
> >                 elsif (($campo =~ /\d/) and (not $locnum))
> >                 {
> >                         $locnum =       $campo;     #numero
> >                 }
> >                 elsif (($campo !~ /\d/) and ($locnum))
> >                 {
> >                         $loccpo .=      $campo."  ";       #complemento
> >                 }
> >                 elsif (($campo =~ /\d/) and ($locnum))
> >                 {
> >                         $loccpo .=      $campo."  ";       #complemento
> >                 }
> >
> >                 ++$n;
> >         }
> >
> >         return ($locend,$locnum,$loccpo);
> > }
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
> >
>
>
>
> --
> Gabriel Vieira
> _______________________________________________
> 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