Como dividir o campo de endereço único em 4 campos (nº da casa, direção, nome, sufixo)

8

Eu tenho que fazer uma massagem nos nossos dados de parcelas para torná-los utilizáveis ​​por um programa em helicópteros xerife. O programa requer um dos seguintes formatos de endereço dentro dos campos:

insira a descrição da imagem aqui

Atualmente, nossos endereços estão em um campo: ex: 1234 W Main St.

Existe uma maneira de automatizar a divisão dos campos em um desses formatos desejados?

Eu posso imaginar que o formato de dois campos seria mais fácil apenas pedindo uma divisão após os números, mas também poderia causar um problema para ruas como a 1ª Avenida, etc.

Craig
fonte
O formato "menos desejável" pode ser alcançado facilmente dividindo-se após o primeiro espaço. Dividindo o resto torna-se um complicado bit, já que você pode ou não pode ter um prefixo direção e o nome da rua pode ou não pode ter espaços nele, etc.
Erica
TODOS os seus nomes de ruas estão formatados da mesma maneira? Eu acho que não, que faria analisar o PreDIR complicado
GISKid
Não. Alguns têm PREDIR e outros não. Este seria um bom lugar para criar algum tipo de declaração if / then em um script? Se SE, SW, NE, NE, etc, preenche PREDIR ou não faça nada?
Craig
Como alternativa, em conjunto com a minha resposta, você pode analisar todas as direções à medida que avança, todos os números e depois ver o que resta. Não é bonito ou fácil.
GISKid

Respostas:

10

Em vez de usar vários RegExes para analisar endereços, basta usar a ferramenta pronta para uso da Esri, projetada para esta tarefa, Padronizar endereços . Está disponível em todos os níveis de licença e minha experiência com ela foi positiva.

Imagem Esri

Paulo
fonte
As soluções OOB são melhores, legais (+1)!
Aaron
@Paul Vamos lá, ele pediu python! Brincadeirinha, vou usar isso no futuro também, muito mais fácil que o regex.
GISKid
@GISKid, haha! Comecei tentando analisar o regex e finalmente encontrei essa ferramenta, que não parece ser tão comum. Eu não tenho ideia do porquê.
Paul
1

Você pode conseguir isso na calculadora de campo usando python. Pode não ser o mais elegante, mas é um começo, assumindo o caso mais simples (ou seja, todos os seus endereços parecem iguais). Primeiro, eu criaria os campos adicionais necessários. Supondo que sua coluna com o endereço completo é chamada "Endereço".

Para HOUSENO na calculadora de campo, escreva:

##Return just numbers

import re
def strip_digits(s):
    return re.sub("\D+", "", s)

Isso pode ser chamado na caixa de cálculo como:

strip_digits(!ADDRESS!)

Para o seu nome da rua:

# Return just the alpha characters


import re
def strip_letters (s):
  return re.sub ("\d",  "", s[1:])

Codeblock:

strip_letters(!ADDRESS!)

Para direção, assumindo que é o primeiro caractere de cada vez:

#First character in streetname
import re
def strip_dir(s):
  return re.sub("\d", "", s[0])

Codeblock:

strip_dir(!ADDRESS!)

Aqui está o recurso python para re . Este Estudo de Caso 7.1: Endereços de Rua me ajudou várias vezes a classificar meu banco de dados de rua / endereço usando também módulos python e re. Isso deve ajudá-lo, a partir daqui, se você não estiver obtendo resultados, deseja comentar e eu posso alterar meu código

GISKid
fonte
tentou o código HOUSENO, funcionou, mas também trouxe todos os dados numéricos dos nomes das ruas, além dos dados dos números das casas. talvez para essa porção dividir no primeiro espaço seja o caminho a seguir.
Craig
Opa, desculpe, isso é um erro no meu código
GISKid
Tudo bem, tente o novo @Craig
GISKid
Eu tentei os códigos HOUSENO e STREETNAME. O problema que estou tendo é que, para a HOUSENO, ela está capturando todos os dados numéricos, mesmo que o nome da rua seja 1234th Street, então acabo com alguns registros 1231234 da 123 1234th Street. Da mesma forma, a partir do código STREETNAME, ele está removendo todos os dados numéricos, portanto, a 1234th Street retorna a "th Street"
Craig
Conseguir que o regex trabalhe em algo tão não padronizado quanto os endereços nos EUA será uma tarefa realmente difícil.
Paul
0

Como Erica disse, seu segundo formato é fácil. Se todos os nomes de ruas fossem uma palavra, você poderá verificar o tamanho da lista depois de dividir o campo original. Comprimento 3 = sem prefixo, comprimento 4 = possui um prefixo (também assumindo que SUFTYPE sempre é preenchido). Isso falha quando uma rua tem mais de uma palavra, como 'Grand River'. Você pode verificar se o segundo elemento corresponde a uma lista de prefixos permitidos e prosseguir a partir daí. Você precisaria testar isso para ver se funcionava com seus dados.

recurvata
fonte
0

Verifique se a entrada está no formato string e simplesmente use a função string.split () que será dividida em espaço em branco e retornará uma lista. (por exemplo, "1234 W Main St." retornaria ["1234", "W", "Main", "St."])

A partir daí, eu usaria algumas instruções condicionais para verificar seus dados, dependendo da consistência de sua entrada. Se a única inconsistência em seus dados é que, às vezes, há um predir e outras, não, simplesmente faça uma verificação de len na lista retornada para ver se ele tem um comprimento de 3 ou 4 (ou> 4 se a sua rua nome tem espaços).

se len (splitList) == 4:

    HouseNo = splitList[0]
    PreDir = splitList[1]
    StreetName = splitList[2]
    SufType = splitList[3]

elif len (splitList) == 3:

    HouseNo = splitList[0]
    PreDir = ""
    StreetName = splitList[1]
    SufType = splitList[2]
papadoo
fonte