2012-03-08 1 views
0

와 Excel 워크 시트의 열 머리글에 대한 구문 분석 I는 다음과 같습니다 Excel 스프레드 시트가 있습니다. 전달중인 문자열이 정확한 열 머리글과 일치하지 않을 수 있습니다.파이썬

내가 xlrd을 사용하고이 같은 일을하고있다 :

setOfheadings = set(['ABC', 'JKL']) 
found_header = False 
for i in range(1,sheet.nrows): 
    if ((not found_header)): 
     setOfRowValues = set([element.upper() for element in sheet.row_values(i)]) 
     if len(setOfheadings.intersection(setOfRowValues)) == len(setOfheadings): 
      (found_header, header_row) = (True,i) 

'ABC'가 정확히 스프레드 시트에서 'ABC 골을'일치하지 않기 때문에

. 그것은 실패합니다. 내 setOfheadings에 정확한 일치 항목이 포함되어 있으면 작동합니다.

집합 교차로와 정규 표현식 일치를 수행하는 방법에 대한 아이디어가 있습니까?

+1

; 태그가 제거되었습니다. –

답변

0

여기 한 가지 방법이 있습니다. 기능 : 열과 행을 반복하는 코드에서 부정합 일치를 정의합니다. 텍스트가 아닌 데이터에 대한 충돌을 방지합니다. 예상되는 행이 발견되면 밖으로 나가게됩니다.

targets = ('ABC', 'JKL') 

def fuzzy_match(target, some_text): 
    return target in some_text # or something fancier 

found_header = False  
for i in xrange(1, sheet.nrows): 
    row_text = [ 
     v.upper() 
     for v, t in zip(sheet.row_values(i), sheet.row_types(i)) 
     if t == xlrd.XL_CELL_TEXT # avoid non-text cells; see note below 
     ] 
    found_header = all(
     any(fuzzy_match(target, item) for item in row_text) 
     for target in targets 
     ) 
    if found_header: 
     header_row = i 
     break 

텍스트가 아닌 셀을 피하는 코드는 xlrd에만 해당됩니다. 이 것하고 좀 더 일반적인 방법은 수 :이 질문은 Excel` 또는`xlrd` '과는 전혀 무관

for v in sheet.row_values(i) 
if isinstance(v, basestring) 
0

이러한 종류의 문제는 CS에서 가장 어려운 과목 중 하나 인 NLP과 관련됩니다. 파이썬에는 NLP에 대한 강력한 모듈 인 NLTK (Natural Language Toolkit)이 있습니다.

이렇게하는 한 가지 방법은 n-gram과 같은 알고리즘을 사용하여 얻고 자하는 것과 원하는 거리를 계산하는 것이지만, 이런 종류의 퍼지 비교를 할 때마다 오탐 (false positives)이 발생할 위험이 있습니다.