Разбор заголовков столбцов в листе Excel с Python - PullRequest
0 голосов
/ 09 марта 2012

У меня есть таблица Excel, которая выглядит следующим образом:

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 Col» в таблице.Это не удается.Это работает, если мой setOfheadings содержит точное совпадение.

Любые идеи о том, как я могу сделать регулярное выражение с пересечением множества?

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Вот один из способов сделать это. Особенности: Выделяет определение неточного совпадения из кода, который перебирает столбцы и строки. Предотвращает сбой на нетекстовых данных. Выручает, когда найден, по-видимому, желаемый ряд.

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 голосов
/ 09 марта 2012

Эта проблема связана с НЛП , одним из самых сложных предметов в CS. В Python есть мощный модуль, посвященный материалам НЛП, который называется NLTK (Natural Language Toolkit).

Один из способов сделать это - вычислить расстояние от того, что вы хотите, до того, что вы получите, используя некоторый алгоритм, такой как n-грамм , но каждый раз, когда вы делаете нечеткие сравнения такого рода, вы рискуете получить ложные срабатывания. .

...