2012-03-08 19 views
0

列標題我有一個Excel電子表格,看起來像這樣:解析在Excel工作表中使用Python

Row1 :   some text 
some other row : "ABC Col" "DEF Col" "GHI Col" "JKL Col" 
following rows : more text 

我試圖找到包含ABC和JKL行。請注意我傳遞的字符串可能與精確的列標題不匹配。

我使用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

這個問題與Excel或xlrd無關;標籤已移除。 – 2012-03-09 09:18:26

回答

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特有的;一個更一般的做法是: 成爲:

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

這類問題與NLP有關,它是CS中最棘手的主題之一。 Python擁有功能強大的模塊,專門用於NLP的所謂的NLTK(自然語言工具包)。

要做到這一點的一種方法是計算從您想要的距離到使用某種算法(如n-gram)的距離,但是每次進行此類模糊比較時,都有可能導致誤報。