2012-03-08 4 views
0

のExcelワークシートの列見出しの解析私はこのようになりますExcelスプレッドシートを持っています。渡す文字列が正確な列の見出しと一致しない可能性があることに注意してください。は、Python

私は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'とは全く関係ありません。タグが削除されました。 –

答えて

0

これを実行する方法が1つあります。特徴:不正確な一致の定義を、列と行を反復するコードから取り除きます。非テキストデータのクラッシュを回避します。おそらく望ましい行が見つかったときに外に出る。

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

この種の問題は、CSの中で最も厳しい科目の1つであるNLPに関連しています。 Pythonには、NLTK(Natural Language Toolkit)と呼ばれるNLP用の強力なモジュールがあります。

これを行う1つの方法は、n-gramのようなアルゴリズムを使用して得られるものとの距離を計算することですが、この種のファジー比較を行うたびに、誤検出が発生する危険性があります。