
Дисклеймер
Aхтунг! Данный кейс написан новичком: приведенные решения могут быть чрезмерно грубыми, а синтаксические решения лишены изящности.
Нигде в практике юриста не появляется столь острая необходимость в анализе данных, как в банкротных делах: в таких случаях порой нужно в кратчайшие сроки проанализировать большие объемы информации из банковских выписок, чтобы найти подозрительные транзакции или восстановить уничтоженную/спрятанную/подправленную бухгалтерскую отчетность.
Так как большинство выписок предоставляются банками в формате старых добрых excel-таблиц, возникло желание автоматизировать работу по поиску в них необходимой информации. Требовалось разработать такой инструмент, который позволяет:
-
Открыть нужную excel-таблицу и провести построковый и полистовой поиск значения по 1-3 ключевым словам, не заморачиваясь с инструментами самого MO Excel по сортировке и фильтру. Построковый поиск предпочтительный, чтобы позволить выводить всю интересующую транзакцию и проводить поиск по всем колонкам.
-
Обнаружив строки с ключевыми словами — перенести их значения в новую таблицу вместе с номером соответствующей строки.
В качестве инструмента для таких операций был выбран пайтоновский модуль openpyxl.
import openpyxl from openpyxl import Workbook bankstatetment = input('Введите название файла для анализа ') #просим указать имя файла в рабочей директории #просим ввести ключевые для поиска слова obj1= input('Введите ключевое слово ') obj2= input('Введите ключевое слово ') obj3= input('Введите ключевое слово ') wb = openpyxl.load_workbook(bankstatetment) # загружаем выбранную выписку/файл results_string_list = list() #создаем список, куда будет помещаться значение строк с ключевыми словами results_stringrow_list = list() #создаем список, куда будет помещаться номер строки с ключевыми словами
Как я понял, посредством openpyxl нельзя перебирать листы таблицы — в каждом случае приходится прописывать, какой лист таблицы должен стать активным и точно указать его наименование. Конечный пользователь, в результате, будет вынужден удостовериться, что в проверяемом файле все листы названы как в программе «Лист 1», «Лист 2», «Лист 3».
Поиск ключевых слов в строках реализован через перебор значений ячеек в строках с помещением обнаруженных значений в два списка. В итоге у нас получаются два списка: results_string_list для значений строк и results_stringrow_list для номеров соответствующих строк. Так как добавление содержания и номера строки идет одновременно, их индексы в каждом списке будут совпадать, т.е. не нужно будет создавать словарь.
sheet = wb['Лист1'] #делаем активным первый лист таблицы. for row in sheet: #перебор строк в листе string = '' for cell in row: string = string + str(cell.value) + ' ' #определить значение в ячейках строки string_row = str(cell.row)+ ' '#определить номер строки if obj1 in string: results_string_list.append (string) #добавляем значение строки в отдельный список results_stringrow_list.append (string_row) #добавляем номер строки в отдельный список if obj2 in string: results_string_list.append (string) results_stringrow_list.append (string_row) if obj3 in string: results_string_list.append (string) results_stringrow_list.append (string_row)
Аналогичный код идет после установки в качестве активного второго листа страницы и далее. После приступаем к передаче найденных данных в новую таблицу:
wb = Workbook() #создаем новую таблицу ws = wb.active #делаем новую таблицу активной a1 = ws['A1'] a1.value = 'Содержание транзакции' #задаем значение подзаголовка колонки "А" b1 = ws['B1'] b1.value = 'Номер строки с транзакцией' #задаем значение подзаголовка колонки "B"
Дальше пришлось сделать то, за что меня можно поругать: мы не знаем, сколько строк найдет программа, но так, как openpyxl позволяет только записывать значение в каждую ячейку, мы задаем для каждой ячейки колонок результатов свою переменную. Это создает лимит найденных ответов, зависящий от того, сколько ячеек мы прописали таким образом.
a2 = ws['A2'] a3 = ws['A3'] a4 = ws['A4'] a5 = ws['A5'] ... b2 = ws['B2'] b3 = ws['B3'] b4 = ws['B4'] b5 = ws['B5']
Далее выдергиваем каждый результат из списков посредством срезов и цикла for и «вписывая» каждое найденное значение сроки в новую ячейку колонки.
for i in results_string_list[0:1]: a2.value = i for i in results_string_list[1:2]: a3.value = i for i in results_string_list[2:3]: a4.value = i for i in results_string_list[3:4]: a5.value = i ... for i in results_stringrow_list[0:1]: b2.value = i for i in results_stringrow_list[1:2]: b3.value = i for i in results_stringrow_list[2:3]: b4.value = i for i in results_stringrow_list[3:4]: b5.value = i ... wb.save('результаты анализа.xlsx')
Возможно, существует более простой и изящный способ записи результатов в новую таблицу с помощью openpyxl, но такие, пока, мне неведомы.
P.S. При применении openpyxl поиск ключевых слов не был чувствителен к регистру, так что эту проблему решать не пришлось.
ссылка на оригинал статьи https://habr.com/ru/post/557022/
Добавить комментарий