Форум сайта python.su
0
Часто нужен поиск в таблице Excel по слову. Строчек много. В данных часто бывают ошибки. Поэтому сам Excel находит не все. Поискав в инете толком ничего не нашел. Может и есть. Пришлось полюбить Питон (круче него ничего не видел в плане обилия специальных библиотек на все случаи жизни). Сам не программист, хотя приходилось иногда от нужды .
Вот что наваял. Может кому сгодится. Нужен файлик Exel в котором будем искать. В какой-то ячейке вбиваем - что искать. Это можно и из Питона делать (просто пробую как удобнее). В коде соответственно выбираем по какой колонке искать и из каких выводить найденное. Выведет в другой файл.
Если кто поможет советом по улучшению - буду признателен.
import re from Levenshtein import ratio from openpyxl import load_workbook from openpyxl import Workbook import subprocess from array import array ####################### ДВИГАЕТ ИСКОМОЕ СЛОВО ПО ПРОВЕРЯЕМОМУ def Dvigatel(Ftho, Fr): mm = []# s=0# dlinaA=len(Ftho)# dlinaB=len(Fr)# step=0# while step <= dlinaB: vesslova = ratio(Ftho, Fr[step:])# Вес слова s=vesslova mm.append(s)# Добавляем в массив step=step+1 maxim=max(mm)# Максимальный вес indexm=mm.index(maxim)# Индекс максимального веса f=Fr[indexm:] dlinaC=len(f) if dlinaA > dlinaB: e=f[:] else: ost=dlinaC-dlinaA e=f[:-ost] if dlinaA >= dlinaC: e=f v=0 v = ratio(Ftho, e) return v ############################################################## book = Workbook() # Создаем поток-книгу sheet1 = book.active # Выбираем активный лист wb = load_workbook(filename='Ob2017.xlsx') # ВЫБЕРИ ФАЙЛ sheet = wb.get_sheet_by_name('Лист1') # Имя активного листа thot = sheet.cell(row=1, column=7) # В этой ячейке в файле задаем что искать tho = thot.value # Присваиваем Значение ячейки переменной stroki = 1 # Начало счета строк в КОЛОНКЕ поиска strvyvoda = 1 # Начало счета Строки для Вывода в файл while stroki < 21074: # ЦИКЛ КОЛОНКИ ПОИСКА СКОЛЬКО СТРОК В ФАЙЛЕ ПЛЮС 1 a = sheet.cell(row=stroki, column=1) # колонка c = sheet.cell(row=stroki, column=2) # колонка bb = sheet.cell(row=stroki, column=4) # Поисковая колонка bbb = bb.value # Значение ячейки анализа b = bbb.lower() # Приводим все к нижнему регистру zamenasimvolov = re.sub(r'[^\w\s]+|[\d]+', r' ', b) # Оставляем только текст scolkoslov = len(zamenasimvolov.split()) # Сколько слов в ячейке анализа r = re.findall(r'\w+', zamenasimvolov) # Записываем список слов из ячейки slov = 0 # Начало счета слов в ЯЧЕЙКЕ поиска while slov < scolkoslov: # ЦИКЛ ПОДСЧЕТА СЛОВ В ЯЧЕЙКЕ Ftho = tho Fr = r[slov] v=0 v = Dvigatel(Ftho,Fr) if v > 0.75: # УСЛОВИЕ ВЫБОРА ПОДОБРАТЬ КАКОЙ ВЕС НУЖЕН print (Fr) sheet1.cell(row=strvyvoda, column=1).value = a.value # Колонка вывода sheet1.cell(row=strvyvoda, column=3).value = bb.value # Колонка вывода sheet1.cell(row=strvyvoda, column=2).value = c.value # Колонка вывода book.save("Vyvod.xlsx") # Запись в файл strvyvoda = strvyvoda+1 slov = slov + 1 stroki = stroki + 1 subprocess.call("Vyvod.xlsx", shell=True) # Открываем файл результата поиска wb.close() # Закрываем поток
Офлайн
0
Вот в принципе показывает как в слове происходит поиск сдвигом (для ленивых и бестолковых как я ))
Это конечно для поиска в очень “зашумленных” данных. Однако, в некоторых случаях показывает наиболее лучший результат чем просто Левенштейн или поиск в Excel, например.
from Levenshtein import ratio from array import array a = "паровоз" #Искомое слово b = "sdfgsdfggjhjdjпоровоздиипрелятjkhjkkhjghh" # Внутри есть что-то похожее c=[] mm = [] s=0 dlinaA=len(a) print (dlinaA) dlinaB=len(b) print (dlinaB) otrez=0 step=0 while step <= dlinaB: edit_dist = ratio(a, b[step:]) s=edit_dist mm.append(s) print (step,b[step:],mm[step]) step=step+1 maxim=max(mm) indexm=mm.index(maxim) c=b[indexm:] dlinaC=len(c) if dlinaA > dlinaB: e=c[:] else: ost=dlinaC-dlinaA e=c[:-ost] if dlinaA >= dlinaC: e=c edit_dist2 = ratio(a, e) print (indexm, a, e, edit_dist2, indexm )
Офлайн