소유자 이름이있는 속성 데이터가 있습니다. 성 이 포함 된 데이터를 두 번 선택 해야합니다 .
예를 들어, " BENNETT MCCARL & ARNETTE BENNETT " 라고하는 소유자 이름이있을 수 있습니다 .
위의 예와 같이 성이 반복되는 속성 테이블에서 행을 선택하고 싶습니다. 누구든지 해당 데이터를 선택하는 방법을 알고 있습니까?
소유자 이름이있는 속성 데이터가 있습니다. 성 이 포함 된 데이터를 두 번 선택 해야합니다 .
예를 들어, " BENNETT MCCARL & ARNETTE BENNETT " 라고하는 소유자 이름이있을 수 있습니다 .
위의 예와 같이 성이 반복되는 속성 테이블에서 행을 선택하고 싶습니다. 누구든지 해당 데이터를 선택하는 방법을 알고 있습니까?
답변:
이 답변에 근거한 필드 계산기 표현
def cw(sentence):
words = sentence.split()
counts = {}
nMax=0
for word in words:
if word not in counts:counts[word] = 0
counts[word] += 1
nMax=max(nMax, counts[word])
return nMax
'==================================================== =
cw( !MUID!)
문자열에서 같은 단어의 최대 개수를 반환합니다.
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)
파이썬에서 플래그 (여기서 0과 1)를 사용 re
하고 set
설정하는 것은- 없이 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
경우에는 모두 실패합니다. 이 경우 Suffix Tree 알고리즘 을 사용해야 할 수도 있고 다행히 파이썬에는 여기에 몇 가지 라이브러리가 있습니다 .
소스 데이터가 파일 GeoDatabase의 FeatureClass / Table이라고 가정하면 다음 쿼리는 필요한 행을 선택합니다.
SUBSTRING(name FROM 1 FOR 7) = 'BENNETT' AND SUBSTRING(name FROM (CHAR_LENGTH(name) - 6) FOR 7) = 'BENNETT
name
필드 name
입니다. 방금 전화했습니다 . 첫 번째 부분은 왼쪽을 테스트하고 두 번째 부분은 오른쪽을 테스트합니다. 이 쿼리는 분명히 다른 성으로 선택 해야하는 경우 변경해야 할 사항을 해결할 수 있기를 원한다면 BENNETT를 검색하도록 하드 코딩되어 있습니다.