[Cascavel-pm] Parse de Endereço (Was: Re: Separando campos)

Daniel Ruoso daniel em ruoso.com
Terça Março 20 08:23:55 PDT 2007


Seg, 2007-03-19 às 11:39 -0300, Veronica Soraia escreveu:
> 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.

Vendo esse problema, me lembrei de uma migração que tive que fazer uma
vez de um banco de dados lazarento em access para um banco de dados
PostgreSql. Uma das diferenças dos bancos de dados era que o endereço no
banco novo era completamente estruturado (conforme utilizado pelos
correios) em Tipo de Logradouro, Logradouro, Número e Complemento,
enquanto no banco de dados anterior foi preenchido completamente à mão
por um conjunto indefinido de pessoas.

O parse não foi perfeito, mas os casos que consegui localizar enquanto
estava escrevendo o script foram atendidos... De repente valia a pena
fazer um módulo Brasil::Parse::Endereco :)... e fazer test cases...

bem... aí vai o código que eu fiz na altura:

<code>
sub extrair_endereco {
        my $endereco = shift;
        my $original = $endereco;
        my ($t,$l,$n,$c) = ('','','','');

        if ($endereco =~ /^rua\,*\s*(.+)$/i) {
                $t = "Rua";
                $endereco = $1;
        } elsif ($endereco =~ /^av\.*\,*\s*(.+)$/i) {
                $t = "Avenida";
                $endereco = $1;
        } elsif ($endereco =~ /^trav\.*\,*\s*(.+)$/i) {
                $t = "Travessa";
                $endereco = $1;
        }

        if ($endereco =~ /^([^,]+)\s*,\s*(.+)$/i) {
                $l = $1;
                $endereco = $2;
        } elsif ($endereco =~ /^(.+)\s*N\.*º\s*(.+)$/i) {
                $l = $1;
                $endereco = $2;
        } elsif ($endereco =~ /^(.\D+)\s+(\d+?.+)$/i) {
                $l = $1;
                $endereco = $2;
        }

        if ($endereco =~ /^(\S+)\s+(.+)$/) {
                $n = $1;
                $c = $2;
        } else {
                $n = $endereco;
                $c = '';
        }

        return ($t,$l,$n,$c);
}
</code>

Alguém acha a idéia interessante?

daniel



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