Cómo dividir el campo de una sola dirección en 4 campos (número de casa, dirección, nombre, sufijo)

8

Tengo que hacer un poco de masaje de los datos de nuestro paquete para que pueda ser utilizado por un programa en helicópteros Sheriff. El programa requiere uno de los siguientes formatos de dirección dentro de los campos:

ingrese la descripción de la imagen aquí

Nuestras direcciones están actualmente en un campo: por ejemplo: 1234 W Main St.

¿Hay alguna manera de automatizar la división de los campos en cualquiera de estos formatos deseados?

Me imagino que el formato de dos campos sería más fácil simplemente llamando a una división después de los números, pero también podría causar un problema para calles como 1st Ave, etc.

Craig
fuente
El formato "menos deseable" podría lograrse fácilmente dividiéndolo después del primer espacio. Dividir el resto se vuelve un poco más complicado, ya que puede o no tener un prefijo de dirección y el nombre de la calle puede o no tener espacios, etc.
Erica
¿TODOS los nombres de sus calles tienen el mismo formato? Supongo que no, lo que dificultaría el análisis del PreDIR
GISKid
No. Algunos tienen PREDIR y otros no. ¿Sería este un buen lugar para crear algún tipo de declaración if / then en un script? Si SE, SW, NE, NE, etc., entonces rellena PREDIR, ¿no hará nada?
Craig
Alternativamente, junto con mi respuesta, puede analizar todas las direcciones a medida que avanza, todos los números y luego ver lo que le queda. No es bonito ni fácil.
GISKid

Respuestas:

10

En lugar de usar múltiples RegExes para analizar direcciones, simplemente use la herramienta lista para usar de Esri diseñada para esta tarea, estandarizar direcciones . Está disponible en todos los niveles de licencia y mi experiencia con él ha sido positiva.

Imagen de Esri

Pablo
fuente
¡Las soluciones OOB son las mejores, agradables (+1)!
Aaron
@Paul ¡Vamos, pidió pitón! Es broma, también lo usaré en el futuro, mucho más fácil que regex.
GISKid
@GISKid, jaja! Comencé tratando de analizar con expresiones regulares, y finalmente encontré esta herramienta, que no parece ser tan común. No tengo ni idea de porqué.
Paul
1

Puede lograr esto en la calculadora de campo usando python. Puede que este no sea el más elegante, pero es un comienzo, asumiendo el caso más simple (es decir, todas sus direcciones se ven iguales). Primero crearía los campos adicionales necesarios. Asumiendo que su columna con la dirección completa se llama "Dirección".

Para HOUSENO en la calculadora de campo, escriba:

##Return just numbers

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

Esto se puede llamar desde el cuadro de cálculo como:

strip_digits(!ADDRESS!)

Para su nombre de calle:

# Return just the alpha characters


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

Codeblock:

strip_letters(!ADDRESS!)

Para la dirección asumiendo que es el primer personaje cada vez:

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

Codeblock:

strip_dir(!ADDRESS!)

Aquí está el recurso de python para re . Este caso de estudio 7.1: Direcciones de calles me ha ayudado en numerosas ocasiones a ordenar mi base de datos de calles / direcciones también usando módulos python y re. Esto debería ayudarte, desde aquí si no estás obteniendo resultados, quieres comentar y puedo alterar mi código

GISKid
fuente
probé el código HOUSENO, funcionó, pero también trajo todos los datos numéricos del nombre de la calle junto con los datos del número de la casa. quizás para esta porción dividirse en el primer espacio es el camino a seguir.
Craig
Vaya, lo siento, es un error en mi código
GISKid
Bien, prueba el nuevo @Craig
GISKid
He probado los códigos HOUSENO y STREETNAME. El problema que tengo es que, para HOUSENO, está tomando todos los datos numéricos, incluso si el nombre de la calle es 1234th Street, por lo que termino con algunos registros 1231234 de 123 1234th Street. Del mismo modo, desde el código STREETNAME, está eliminando todos los datos numéricos, por lo que 1234th Street está devolviendo "th Street"
Craig
Hacer que regex funcione en algo tan poco estandarizado como las direcciones en los Estados Unidos será una tarea difícil.
Paul
0

Como dijo Erica, su segundo formato es fácil. Si todos los nombres de sus calles fueran una palabra, podría verificar la longitud de la lista después de dividir el campo original. Longitud de 3 = sin prefijo, longitud de 4 = tiene un prefijo (también suponiendo que SUFTYPE siempre esté poblado). Esto falla cuando una calle tiene más de una palabra, como 'Grand River'. Puede verificar si el segundo elemento coincide con una lista de prefijos permitidos y proceder desde allí. Tendría que probar esto para ver si funcionaba con sus datos.

recurvata
fuente
0

Asegúrese de que su entrada esté en formato de cadena y simplemente use la función string.split () que se dividirá en espacios en blanco y devolverá una lista. (por ejemplo, "1234 W Main St." devolvería ["1234", "W", "Main", "St."])

A partir de ahí, usaría algunas declaraciones condicionales para verificar sus datos dependiendo de qué tan consistente sea su entrada. Si la única inconsistencia en sus datos es que a veces hay un predir y otras no, simplemente verifique la lista devuelta para ver si tiene una longitud de 3 o 4 (o> 4 si su calle El nombre tiene espacios).

if 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
fuente