所有者名の属性データがあります。姓を2回含むデータを選択する必要があります。
たとえば、「BENNETT MCCARL&ARNETTE BENNETT」という所有者名があるとします。
上記の例のように、姓が繰り返し出現する属性テーブルの行を選択します。そのデータを選択する方法を誰かが知っていますか?
所有者名の属性データがあります。姓を2回含むデータを選択する必要があります。
たとえば、「BENNETT MCCARL&ARNETTE BENNETT」という所有者名があるとします。
上記の例のように、姓が繰り返し出現する属性テーブルの行を選択します。そのデータを選択する方法を誰かが知っていますか?
回答:
これを行うには、Python コレクションモジュールと更新カーソルを使用できます。このメソッドは、新しいフィールドを追加し、1
重複がある場合はそれを入力し0
ます。重複がない場合はそれを入力します。
import arcpy, collections
shp = r'C:\temp\names.shp'
# Add a field called "check" to store binary data.
arcpy.AddField_management(shp, field_name = "check", field_type = "SHORT")
# Use an Update Cursor to query the table and write to new rows
# 1 = has duplicates
# 0 = no duplicates
with arcpy.da.UpdateCursor(shp, ["last_names", "check"]) as cursor:
for row in cursor:
names = row[0].replace("&", "").split() # Clean the string
counts = collections.Counter(names) #create dictionary to count occurrences of words
if any(x > 1 for x in list([count for name, count in counts.items()])):
row[1] = 1
else:
row[1] = 0
cursor.updateRow(row)
python-でのフラグの使用re
とset
設定(ここでは0と1)についてはどうですか?without re
からすべての名前(最後と最初)を抽出します。パターンマッチングの優先度が最も高いため、好きなように使用できます。BENNETT MCCARL & ARNETTE BENNETT
&
re
re
import re
def sorter(val):
words = re.findall(r'\w+',val)
uniques = set(words)
if len(words)>len(uniques):
return 1
else:
return 0
そして電話する sorter( !N! )
**でregex
単語をつかむ方法を参照してくださいLIVE DEMO
これらの回答はすべて、データが無害化されている、つまり単語間に適切なスペースがあると仮定して問題に対処しますが、データがBENNETTMCCARL&ARNETTEBENNETT
このようなものである場合、これらすべてが失敗します。その場合、サフィックスツリーアルゴリズムを使用する必要があるかもしれません。幸いにも、Pythonはここにあるようなライブラリを持っています。
ソースデータがファイルジオデータベースのFeatureClass /テーブルであるとすると、次のクエリは必要な行を選択します。
SUBSTRING(name FROM 1 FOR 7) = 'BENNETT' AND SUBSTRING(name FROM (CHAR_LENGTH(name) - 6) FOR 7) = 'BENNETT
name
フィールドname
です。たまたま呼び出しただけです。最初の部分は左側をテストし、2番目の部分は右側をテストしています。このクエリは明らかにBENNETTを検索するようにハードコードされています。他の姓で選択する必要がある場合は、変更が必要なものを見つけることができますか?