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.

Craig
la source
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

Paul
la source
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

GISKid
la source
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.

recurvata
la source
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]
papadoo
la source