Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2017 14:54:09

ualish
Зарегистрирован: 2017-08-28
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг регулярками из текстового файла

Доброго дня уважаемые специалисты!
Застрял в процессе изучения Питона на практическом примере парсинга из сырого .txt в табличный вид или .csv c перестановкой полей.
Последовательность: Читаю файл, выделяю регулярками, заношу в словарь, переставляю поля, пишу в файлы (выход, отсев).

Чувствую явно что-то делаю не так.
Укажите, если не трудно, на ошибки и направление действий в подобных задачах.
Код

 import sys
import re
### Входные данные
test_str = (" (00401) МОСКВА Г., АТ \"СУПЕРБАНК\" ГЛВ ОФИС            IABS/Клиент-Банк Изг:18.05.2017\n\n"
	"                       Сведения о работе счета c 18.05.2017 по 18.05.2017\n\n"
	"Cчет:   20202020202020202020             OОО  \"РОГА И КОПЫТА\"           ИНН: 999999999\n"
	"Остаток на начало периода:       49,481,968.81             Остаток на конец периода:       51,933,468.81\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"   Дата   | Счет/ИНН           | № док-та |Оп| МФО |   Оборот Дебет   |   Оборот Кредит  |      Назначение платежа      |\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"18.05.2017|20208000904636134001|0000000211| 4|01013|              0.00|        364,001.00|00668 за подключение, регистра\n"
	"  09:05:23|       ИНН 206921309|          |  |     |                  |                  |ции и использование интернет с\n"
	"          |\"SHIFO-NUR EXIMER\" о|          |  |     |                  |                  |ог дог № 19_1919/1919 от 17.05\n"
	"          |бщество с ограниченн|          |  |     |                  |                  |.2017г.\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"19.05.2017|20208000400575629001|0000000112| 4|01098|              0.00|         22,530.00|00644 п/о 100% согл. Дог №19_1\n"
	"  10:21:20|       ИНН 303747364|          |  |     |                  |                  |919/1920 от 30.06.2016 за услу\n"
	"          |ОК \"ORIENT MARKETING|          |  |     |                  |                  |ги телеф за май 2017г\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"20.05.2017|20208000800418698001|0000000248| 4|00980|              0.00|        135,000.00|00668Оплата 100% за дебеторски\n"
	"  10:25:48|       ИНН 303146954|          |  |     |                  |                  |й задолжност по дог№ 19-1919/1\n"
	"          |ООО \"SIGMA ТАТА\"    |          |  |     |                  |                  |921 25,05,2015г.\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"20.05.2017|20208000100325098001|0000000237| 4|00478|              0.00|         80,000.00|00668 за интернет услуги 2017г\n"
	"  10:25:48|       ИНН 302946972|          |  |     |                  |                  | согл дог19_190/1922 от 09,02,\n"
	"          |\"SUS BIN TAMIR\"  MAS|          |  |     |                  |                  |2017\n"
	"------------------------------------------------------------------------------------------------------------------------\n"
	"22.05.2017|23402000300100001010|0115600082| 4|00014|              0.00|         76,500.00|006024001228602628379501000750\n"
	"  10:39:53|       ИНН 201122919|          |  |     |                  |                  |49~203440363~268 офис ~оплата\n"
	"          |Казначейство Министе|          |  |     |                  |                  | 100% за апрель м-ц 2017г за и\n"
	"          |рство Финансов ФРз  |          |  |     |                  |                  |нтернет к дог №191938/1923  от\n"
	"          |                    |          |  |     |                  |                  | 16,03,2017г . с/ф№2921 Р-7751\n"
	"          |                    |          |  |     |                  |                  |71 от  30.04.2017г.  ; Ст.  42\n"
	"          |                    |          |  |     |                  |                  |.92.200\n"
	"------------------------------------------------------------------------------------------------------------------------")
#filename = 'input_txt_1.txt'
codepage = 'utf-8'
look_org_inn = r"ИНН\s\d{9}"
look_pay_date = r"\d{2}\.\d{2}\.\d{4}\|"
look_pay_time = r"\d{2}\:\d{2}\:\d{2}\|"
look_pay_sum = r"(\d*\,*\d{,3}\,\d{3}\.\d{2}\|)"
look_org_rs = r"\|\d{20}\|"
look_org_name = r"(?:\|[a-zA-Zа-яА-я\s/\"\/\-/\`]{20}\|)"
look_pay_comment = r"(?:\|.[а-яА-Я\w\_\s/\./\,\№\%//\-\~\;]{29})"
while True:
    try:
        #input_file = open(filename, 'r', encoding=codepage) ### Открываем из файла
        input_file = test_str ###   из test_str
    except Exception:
        print("Error: ", sys.exc_info()[1], '...')
        filename = input('Enter correct file name! :')
    else:
        #file_content = input_file.read() ### Читаем файл
        file_content = input_file ### читаем из стринга
        ### Словари
        dic_org_inn = {}
        dic_pay_date = {}
        dic_pay_time = {}
        dic_pay_sum = {}
        dic_org_rs = {}
        dic_org_name = {}
        dic_pay_comment = {}
        ### Регулярки
        org_inn = re.findall(look_org_inn, file_content)
        pay_date = re.findall(look_pay_date, file_content)
        pay_time = re.findall(look_pay_time, file_content)
        pay_sum = re.findall(look_pay_sum, file_content)
        org_rs = re.findall(look_org_rs, file_content)
        org_name = re.findall(look_org_name, file_content)
        pay_comment = re.findall(look_pay_comment, file_content)
        ### проходим по строчно
        for item in org_inn:
            dic_org_inn["inn"] = item
            #print(dic_org_inn["inn"])
        for item in pay_date:
            dic_pay_date["date"] = item
            #print(dic_pay_date["date"])
        for item in pay_time:
            dic_pay_time["time"] = item
            #print(dic_pay_time)
        for item in pay_sum:
            dic_pay_sum["pay_sum"] = item
            #print(dic_pay_sum)
        for item in org_rs:
            dic_org_rs["rs"] = item
            #print(dic_org_rs)
        for num, item in enumerate(org_name, 1):
            dic_org_name["org_name"] = item
            #print(dic_org_name)
        for num, item in enumerate(pay_comment, 1):
            dic_pay_comment["pay_comment"] = item
            #print(dic_pay_comment)
        ### переставляем поля
        print(dic_org_inn["inn"], dic_pay_date["date"], dic_pay_time["time"],
              dic_pay_sum["pay_sum"], dic_org_rs["rs"], dic_org_name["org_name"],
              dic_pay_comment["pay_comment"])
        ### Итоги
        print('>>> Найдено ИНН из 9 цифер всего:     ' + str(len(org_inn)) + ' строк')
        print('    Найдено СЧЕТОВ из 20 цифер всего: ' + str(len(org_rs)) + ' строк')
        print('    Найдено ДАТА оплаты всего:        ' + str(len(pay_date)) + ' строк')
        print('    Найдено ВРЕМЯ оплаты всего:       ' + str(len(pay_time)) + ' строк')
        print('    Найдено СУММ оплат всего:         ' + str(len(pay_sum)) + ' строк')
        print('    Найдено ОРГАНИЗАЦИЙ всего:        ' + str(len(org_name)) + ' строк')
        print('    Найдено КОММЕНТОВ всего:          ' + str(len(pay_comment)) + ' строк')
        ### Далее проверки и вывод в файлы
        sys.exit()


Офлайн

#2 Авг. 30, 2017 03:23:47

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

парсинг регулярками из текстового файла

Насколько я понял, нужно считать таблицу. Я бы использовал следующий подход:
Если строка состоит только из ——, то входим в дополнительный цикл и построчно читаем до тех пор, пока не всретится снова строка из ——-. Каждую строку во внутреннем цикле прогоняем через split('|'), т.к. | - разделитель колонок. Все это, что происходит во внутреннем цикле, заносим в список, который очищается всякий раз, когда встречается строка из ——-. Этот список имеет вид [, , , , ,] и имеет длину числа колонок. После того, как встречается ———— мы выходим из этого внутреннего цикла и все то, что находится в каждом внутреннем списке объединяем с помощью ‘ ’.join(inner_list). Пример такого списка: [, , … ] – для каждого внутреннего и делается join. В итоге, после каждого ————, когда мы выходим из внутреннего цикла и делаем join, мы получаем список строк, отражающих содержимое ячеек. И без regexp. Каждую строку можно заносить в отдельный список. По окончании, имеем разгруженную таблицу…




Офлайн

#3 Авг. 30, 2017 09:43:34

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

парсинг регулярками из текстового файла

ualish
сначала преобразуй в массив

 lines = str(test_str).split('\n')
tbl = []
for l in lines:
    lst =  [ i for i in l.split('|') if i]
    if len(lst): tbl.append(lst)
del lines
for i in range(len(tbl)): print(i,len(tbl[i]),tbl[i])

Отредактировано vic57 (Авг. 30, 2017 09:52:50)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version