[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