単一の住所フィールドを4つのフィールドに分割する方法(ハウス番号、方向、名前、サフィックス)


8

保安官のヘリコプターのプログラムで使用できるようにするために、小包データを少しマッサージする必要があります。プログラムでは、フィールド内に次のいずれかの住所形式が必要です。

ここに画像の説明を入力してください

現在、住所は1つのフィールドにあります。例:1234 W Main St.

フィールドをこれらの望ましい形式のいずれかに分割することを自動化する方法はありますか?

2つのフィールド形式は、数値の後に分割を呼び出すだけで簡単になると想像できますが、1st Aveなどの道路でも問題が発生する可能性があります。


「あまり望ましくない」フォーマットは、最初のスペースの後に分割することでかなり簡単に実現できます。あなたがたりなど、またはそれにスペースがあってもなくてもよい方向プレフィックスと通りの名前、あってもなくてもよいので、分割は残りの部分は、ビットトリッキーになります
エリカ

ストリートネームはすべて同じようにフォーマットされていますか?どちらがPreDIRを解析するのが難しいのか推測しません
GISKid '23 / 07/14

いいえ。PREDIRがあるものとないものがあります。これは、スクリプトにif / thenステートメントを作成するのに適していますか?SE、SW、NE、NEなどの場合、PREDIRに入力します。それ以外の場合は何もしませんか?
Craig

あるいは、私の回答と組み合わせて、あなたが進むにつれてすべての方向、すべての数字を解析して、残っているものを見ることができます。美しくも簡単でもありません。
GISKid 14

回答:


10

複数のRegExesを使用してアドレスを解析する代わりに、このタスク用に設計されたEsriの標準ツールであるStandardize Addressesを使用するだけです。これはすべてのライセンスレベルで利用でき、私の経験はポジティブです。

Esri画像


OOBソリューションは最高です(+1)!
アーロン

@Paulさあ、彼はパイソンを求めました!冗談ですが、これも将来的に使用する予定です。正規表現よりもはるかに簡単です。
GISKid 14

@GISKid、ハハ!私は正規表現で解析しようとして始め、ついにこのツールに出会いましたが、これはそれほど一般的ではないようです。なぜか分かりません。
ポール

1

あなたは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モジュールを使用して私のストリート/アドレスデータベースを整理するのに何度も役立ちました。これはあなたを助けるはずです、あなたがコメントしたい結果が得られないなら、ここから私は私のコードを変更できます


HOUSENOコードを試してみましたが、うまくいきましたが、番地データとともにすべての数値のストリート名データももたらしました。おそらくこの部分では、最初のスペースで分割するのがよいでしょう。
Craig

おっと、申し訳ありませんが、私のコードのエラーです
GISKid

では、新しいものを試してみてください@Craig
GISKid 2014

HOUSENOとSTREETNAMEの両方のコードを試しました。私が抱えている問題は、HOUSENOの場合、通りの名前が1234th Streetであってもすべての数値データを取得することです。そのため、123 1234th Streetから1231234のレコードがいくつかあります。同様に、STREETNAMEコードからすべての数値データを取り除いているため、1234th Streetは「th Street」を返します
Craig

米国の住所のように標準化されていないものに正規表現を機能させることは、実際には困難な作業になります。
ポール

0

エリカが言ったように、2番目のフォーマットは簡単です。すべてのストリート名が1つの単語である場合は、元のフィールドを分割した後でリストの長さを確認できます。長さ3 =接頭辞なし、長さ4 =接頭辞あり(SUFTYPEが常に入力されていることも想定)。「Grand River」のように、通りが複数の単語の場合、これは失敗します。2番目の要素が許可されたプレフィックスのリストと一致するかどうかを確認し、そこから続行できます。これをテストして、データが機能するかどうかを確認する必要があります。


0

入力が文字列形式であることを確認し、空白で分割してリストを返す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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.