So teilen Sie ein einzelnes Adressfeld in 4 Felder auf (Hausnummer, Richtung, Name, Suffix)

8

Ich muss unsere Paketdaten massieren, damit sie von einem Programm in Sheriff-Hubschraubern verwendet werden können. Das Programm benötigt eines der folgenden Adressformate in den Feldern:

Geben Sie hier die Bildbeschreibung ein

Unsere Adressen befinden sich derzeit in einem Bereich: Beispiel: 1234 W Main St.

Gibt es eine Möglichkeit, die Aufteilung der Felder in eines dieser gewünschten Formate zu automatisieren?

Ich kann mir vorstellen, dass das Zwei-Feld-Format einfacher wäre, wenn nur eine Aufteilung nach den Nummern erforderlich wäre, aber auch ein Problem für Straßen wie 1st Ave usw. verursachen könnte.

Craig
quelle
Das "weniger wünschenswerte" Format könnte ziemlich leicht durch Aufteilen nach dem ersten Leerzeichen erreicht werden. Das Aufteilen des Restes wird etwas schwieriger, da Sie möglicherweise ein Richtungspräfix haben oder nicht und der Straßenname möglicherweise Leerzeichen enthält usw.
Erica
Sind ALLE Ihre Straßennamen gleich formatiert? Ich würde nicht raten, was das Parsen des PreDIR schwierig machen würde
GISKid
Einige haben PREDIR und andere nicht. Wäre dies ein guter Ort, um eine if / then-Anweisung in einem Skript zu erstellen? Wenn SE, SW, NE, NE usw. dann PREDIR bevölkern, sonst nichts tun?
Craig
Alternativ können Sie in Verbindung mit meiner Antwort alle Richtungen und Zahlen analysieren und dann sehen, was Ihnen noch bleibt. Es ist nicht schön oder einfach.
GISKid

Antworten:

10

Anstatt mehrere RegExes zum Parsen von Adressen zu verwenden, verwenden Sie einfach das sofort einsatzbereite Tool von Esri, das für diese Aufgabe entwickelt wurde: Adressen standardisieren . Es ist auf allen Lizenzstufen verfügbar und ich habe positive Erfahrungen damit gemacht.

Esri Bild

Paul
quelle
OOB-Lösungen sind am besten, nett (+1)!
Aaron
@ Paul Komm schon, er hat nach Python gefragt! Nur ein Scherz, ich werde dies auch in Zukunft verwenden, viel einfacher als Regex.
GISKid
@ GISKid, haha! Ich habe angefangen, mit Regex zu analysieren, und bin schließlich auf dieses Tool gestoßen, das nicht allzu alltäglich zu sein scheint. Ich habe keine Idee warum.
Paul
1

Sie können dies im Feldrechner mit Python erreichen. Dies ist vielleicht nicht die eleganteste, aber es ist ein Anfang, vorausgesetzt der einfachste Fall (dh Ihre Adressen sehen alle gleich aus). Ich würde zuerst die zusätzlichen Felder erstellen, die benötigt werden. Angenommen, Ihre Spalte mit der vollständigen Adresse heißt "Adresse".

Für HOUSENO im Feldrechner schreiben Sie:

##Return just numbers

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

Dies kann dann aus dem Berechnungsfeld wie folgt aufgerufen werden:

strip_digits(!ADDRESS!)

Für Ihren Straßennamen:

# Return just the alpha characters


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

Codeblock:

strip_letters(!ADDRESS!)

Für die Richtung unter der Annahme, dass es jedes Mal das erste Zeichen ist:

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

Codeblock:

strip_dir(!ADDRESS!)

Hier ist die Python-Ressource für re . Diese 7.1-Fallstudie: Straßenadressen hat mir mehrfach dabei geholfen, meine Straßen- / Adressdatenbank auch mit Python- und Re-Modulen zu sortieren. Dies sollte Ihnen helfen, von hier aus, wenn Sie keine Ergebnisse erhalten, möchten Sie einen Kommentar und ich kann meinen Code ändern

GISKid
quelle
versuchte den HOUSENO-Code, es funktionierte, aber es brachte auch alle numerischen Straßennamen-Daten zusammen mit Hausnummern-Daten. Vielleicht ist für diesen Teil die Aufteilung im ersten Raum der richtige Weg.
Craig
Hoppla, tut mir leid, das ist ein Fehler in meinem Code
GISKid
Okay, probieren Sie den neuen @Craig
GISKid
Ich habe sowohl HOUSENO- als auch STREETNAME-Codes ausprobiert. Das Problem, das ich habe, ist, dass HOUSENO alle numerischen Daten erfasst, auch wenn der Straßenname 1234th Street lautet. Daher habe ich einige Datensätze mit 1231234 von 123 1234th Street. In ähnlicher Weise werden aus dem STREETNAME-Code alle numerischen Daten entfernt, sodass die 1234th Street "th Street" zurückgibt
Craig
Es wird in der Tat eine schwierige Aufgabe sein, Regex dazu zu bringen, an etwas zu arbeiten, das nicht standardisiert ist wie Adressen in den USA.
Paul
0

Wie Erica sagte, ist Ihr zweites Format einfach. Wenn alle Ihre Straßennamen ein Wort wären, könnten Sie die Länge der Liste überprüfen, nachdem Sie das ursprüngliche Feld aufgeteilt haben. Länge 3 = kein Präfix, Länge 4 = hat ein Präfix (auch unter der Annahme, dass SUFTYPE immer ausgefüllt ist). Dies schlägt fehl, wenn eine Straße mehr als ein Wort enthält, z. B. "Grand River". Sie können überprüfen, ob das zweite Element mit einer Liste zulässiger Präfixe übereinstimmt, und von dort aus fortfahren. Sie müssten dies testen, um festzustellen, ob es mit Ihren Daten funktioniert.

recurvata
quelle
0

Stellen Sie sicher, dass Ihre Eingabe im Zeichenfolgenformat vorliegt, und verwenden Sie einfach die Funktion string.split (), die auf Leerzeichen aufgeteilt wird und eine Liste zurückgibt. (zB "1234 W Main St." würde zurückgeben ["1234", "W", "Main", "St."])

Von dort aus würde ich einige bedingte Anweisungen verwenden, um Ihre Daten zu überprüfen, je nachdem, wie konsistent Ihre Eingabe ist. Wenn die einzige Inkonsistenz in Ihren Daten darin besteht, dass es manchmal ein Predir gibt und manchmal kein Predir, überprüfen Sie einfach die zurückgegebene Liste, um festzustellen, ob sie eine Länge von 3 oder 4 hat (oder> 4, wenn Ihre Straße Name enthält Leerzeichen).

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
quelle