Comment diviser un champ d'adresse unique en 4 champs (numéro de maison, direction, nom, suffixe)


8

Je dois faire un peu de massage de nos données de colis pour les rendre utilisables par un programme dans des hélicoptères de shérif. Le programme nécessite l'un des formats d'adresse suivants dans les champs:

entrez la description de l'image ici

Nos adresses sont actuellement dans un seul domaine: ex: 1234 W Main St.

Existe-t-il un moyen d'automatiser la division des champs dans l'un de ces formats souhaités?

Je peux imaginer que le format à deux champs serait plus facile en appelant simplement à une séparation après les numéros, mais pourrait également causer un problème pour les rues telles que 1st Ave, etc.


Le format "moins souhaitable" pourrait être obtenu assez facilement en se séparant après le premier espace. Diviser le reste devient un peu plus délicat, car vous pouvez ou non avoir un préfixe de direction et le nom de la rue peut ou non contenir des espaces, etc.
Erica

Tous vos noms de rue sont-ils formatés de la même manière? Je suppose que non, ce qui rendrait l'analyse du PreDIR délicate
GISKid

Non. Certains ont PREDIR et d'autres non. Serait-ce un bon endroit pour créer une sorte de déclaration if / then dans un script? Si SE, SW, NE, NE, etc., remplissez PREDIR, sinon ne faites rien?
Craig

Alternativement, en conjonction avec ma réponse, vous pouvez analyser toutes les directions au fur et à mesure, tous les chiffres, puis voir ce qui vous reste. Ce n'est ni joli ni facile.
GISKid

Réponses:


10

Au lieu d'utiliser plusieurs RegExes pour analyser les adresses, utilisez simplement l'outil prêt à l'emploi d'Esri conçu pour cette tâche, Standardize Addresses . Il est disponible à tous les niveaux de licence et mon expérience avec celui-ci a été positive.

Image Esri


Les solutions OOB sont les meilleures, sympas (+1)!
Aaron

@Paul Allez, il a demandé du python! Je plaisante, je vais également l'utiliser à l'avenir, beaucoup plus facile que regex.
GISKid

@GISKid, haha! J'ai commencé à essayer d'analyser les expressions rationnelles et j'ai finalement trouvé cet outil, qui ne semble pas être si courant. Je ne sais pas pourquoi.
Paul

1

Vous pouvez y parvenir dans la calculatrice de champ en utilisant python. Ce n'est peut-être pas le plus élégant mais c'est un début, en supposant le cas le plus simple (c'est-à-dire que vos adresses se ressemblent toutes). Je voudrais d'abord créer les champs supplémentaires nécessaires. En supposant que votre colonne avec l'adresse complète s'appelle "Adresse".

Pour HOUSENO dans la calculatrice de terrain, écrivez:

##Return just numbers

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

Cela peut ensuite être appelé à partir de la boîte de calcul comme suit:

strip_digits(!ADDRESS!)

Pour le nom de votre rue:

# Return just the alpha characters


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

Codeblock:

strip_letters(!ADDRESS!)

Pour la direction en supposant que c'est le premier caractère à chaque fois:

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

Codeblock:

strip_dir(!ADDRESS!)

Voici la ressource python pour re . Cette étude de cas 7.1: adresses de rue m'a aidé à plusieurs reprises à trier ma base de données de rues / adresses en utilisant également des modules python et re. Cela devrait vous aider, à partir d'ici si vous n'obtenez pas de résultats, vous voulez commenter et je peux modifier mon code


essayé le code HOUSENO, cela a fonctionné, mais il a également apporté toutes les données numériques du nom de la rue avec les données du numéro de la maison. peut-être que pour cette partie, la division au premier espace est la voie à suivre.
Craig

Oups, désolé, c'est une erreur dans mon code
GISKid

Essayez bien le nouveau @Craig
GISKid

J'ai essayé les codes HOUSENO et STREETNAME. Le problème que j'ai est, pour HOUSENO, sa saisie de toutes les données numériques même si le nom de la rue est 1234th Street, donc je termine avec certains enregistrements étant 1231234 de 123 1234th Street. De même, à partir du code STREETNAME, il supprime toutes les données numériques, donc la 1234th Street renvoie "th Street"
Craig

Obtenir des expressions rationnelles pour travailler sur quelque chose d'aussi standardisé que les adresses aux États-Unis sera en effet une tâche difficile.
Paul

0

Comme l'a dit Erica, votre deuxième format est facile. Si tous vos noms de rue étaient un seul mot, vous pouvez vérifier la longueur de la liste après avoir divisé le champ d'origine. Longueur de 3 = pas de préfixe, longueur de 4 = a un préfixe (en supposant également que SUFTYPE est toujours rempli). Cela échoue lorsqu'une rue est composée de plusieurs mots, comme «Grand River». Vous pouvez vérifier si le deuxième élément correspond à une liste de préfixes autorisés et continuer à partir de là. Vous devez tester cela pour voir si cela fonctionne avec vos données.


0

Assurez-vous que votre entrée est au format chaîne et utilisez simplement la fonction string.split () qui se divisera sur l'espace blanc et retournera une liste. (ex. "1234 W Main St." retournerait ["1234", "W", "Main", "St."])

À partir de là, j'utiliserais des instructions conditionnelles pour vérifier vos données en fonction de la cohérence de votre entrée. Si la seule incohérence dans vos données est qu'il y a parfois un prédir et d'autres fois qu'il n'y en a pas, faites simplement une vérification len sur la liste retournée pour voir si elle a une longueur de 3 ou 4 (ou> 4 si votre rue nom contient des espaces).

si 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]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.