保安官のヘリコプターのプログラムで使用できるようにするために、小包データを少しマッサージする必要があります。プログラムでは、フィールド内に次のいずれかの住所形式が必要です。
現在、住所は1つのフィールドにあります。例:1234 W Main St.
フィールドをこれらの望ましい形式のいずれかに分割することを自動化する方法はありますか?
2つのフィールド形式は、数値の後に分割を呼び出すだけで簡単になると想像できますが、1st Aveなどの道路でも問題が発生する可能性があります。
保安官のヘリコプターのプログラムで使用できるようにするために、小包データを少しマッサージする必要があります。プログラムでは、フィールド内に次のいずれかの住所形式が必要です。
現在、住所は1つのフィールドにあります。例:1234 W Main St.
フィールドをこれらの望ましい形式のいずれかに分割することを自動化する方法はありますか?
2つのフィールド形式は、数値の後に分割を呼び出すだけで簡単になると想像できますが、1st Aveなどの道路でも問題が発生する可能性があります。
回答:
複数のRegExesを使用してアドレスを解析する代わりに、このタスク用に設計されたEsriの標準ツールであるStandardize Addressesを使用するだけです。これはすべてのライセンスレベルで利用でき、私の経験はポジティブです。
あなたはPythonを使用してフィールド電卓でこれを達成することができます。これは最もエレガントではないかもしれませんが、最も単純なケース(つまり、アドレスがすべて同じに見える)を想定して、それは始まりです。まず、必要な追加フィールドを作成します。完全な住所の列を「住所」と呼びます。
電卓のHOUSENOについては、次のように記述します。
##Return just numbers
import re
def strip_digits(s):
return re.sub("\D+", "", s)
次に、計算ボックスから次のように呼び出すことができます。
strip_digits(!ADDRESS!)
あなたのストリート名:
# Return just the alpha characters
import re
def strip_letters (s):
return re.sub ("\d", "", s[1:])
コードブロック:
strip_letters(!ADDRESS!)
毎回それが最初の文字であると仮定する方向について:
#First character in streetname
import re
def strip_dir(s):
return re.sub("\d", "", s[0])
コードブロック:
strip_dir(!ADDRESS!)
これがreのpythonリソースです。この7.1のケーススタディ:Street Addressesは、pythonとreモジュールを使用して私のストリート/アドレスデータベースを整理するのに何度も役立ちました。これはあなたを助けるはずです、あなたがコメントしたい結果が得られないなら、ここから私は私のコードを変更できます
入力が文字列形式であることを確認し、空白で分割してリストを返すstring.split()関数を使用します。(例: "1234 W Main St."は["1234"、 "W"、 "Main"、 "St。"]を返します)
そこから、入力の一貫性に応じて、いくつかの条件ステートメントを使用してデータをチェックします。データに唯一の矛盾がある場合は、predirがある場合とない場合がありますが、返されたリストでlenチェックを実行して、長さが3または4かどうかを確認します(または、ストリートが4より大きい場合)。名前にはスペースが含まれています)。
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]