Нужно было успеть до 30-го декабря. Поэтому амбициозный проект с предварительным выводом данных в красивый цветной грид уперся в долгое ковыряние с wx… В конце концов программа свернулась до маленького файлика )))
Задача: обработать записи с выявлением
Номера полиса
Даты страхования
ФИО
Даты рождения
Сравнение даты страхования в нашей компании и в чужой. Если в чужой дата более свежая - то эта дата становится датой остановки страхования у нас. (Dismissed) Если у нас дата больше - пропускаем блок.
Потом найденный данные загоняются в SQL-скрипт, который запускается и “чистит базу”.
Вот пример файла для обработки:
WIN 32010 МСК
======================================================================
(33001) Г11/0161066 26.01.2003 - 01.04.2008 Абакумова Мария Тимофеевна 05.03.1980 2
07236 ЛЕВОКУКУЕВСКОЕ,ЛУГОВАЯ 11/ -
07236 6 МИНИСТЕРСТВО ЗДРАВООХРАНЕНИЯ СТАВРОПОЛЬСКОГО КРАЯ
(32010) 59-1184-004599 25.10.2007 - 31.12.2007 Абакумова Мария Тимофеевна 05.03.1980 1
07236 С. ЛЕВОКУЕВСКОЕ, УЛ. КОМАРОВА, Д. 1 КВ. 1
07402 1184 ОАО СТАВРОПОЛЬЭНЕРГО ФИЛИАЛ ЗАПАДНЫЕ ЭЛЕКТРИЧЕСКИЕ СЕТИ
======================================================================
(33001) 15/031513593534 10.10.2007 - 01.04.2008 Абдурахманов Шамиль Эльдарович 04.05.1966 2
07421 КРАЙ СТАВРОПОЛЬСКИЙ, Р-Н МИНЕРАЛОВОДСКИЙ, С КАНГЛЫ
07421 6 МИНИСТЕРСТВО ЗДРАВООХРАНЕНИЯ СТАВРОПОЛЬСКОГО КРАЯ
(32010) 32-3094-000001 20.07.2006 - 31.12.2007 Абдурахманов Шамиль Эльдарович 04.05.1966 1
07239 С.КАНГЛЫ, М.ДЖАМИЛЯ
07412 3094 ООО ПМК ИНОЗЕМЦЕВСКАЯ-1
======================================================================
(32010) 33-0218-000345 30.11.2007 - 31.12.2007 Абрамов Валерий Георгиевич 28.05.1959 1
07248 ПРЕДГОРНЫЙ Р-Н, С.БЛАГОДАРНОЕ, УЛ. ЛЕНИНА, Д. 52
07427 218 ПЯТИГОРСКИЙ ЗАВОД ОАО
(32011) 5.030567 18.04.2005 - 01.04.2008 Абрамов Валерий Георгиевич 28.05.1959 2
07248 С НОВОБЛАГОДАРНОЕ ЛЕНИНАБАДСКАЯ 52
07248 7000 МИНИСТЕРСТВО ЗДРАВООХРАНЕНИЯ
======================================================================
...и т д. Адреса и имена, понятно, левые.
# -*- coding: cp1251 -*-
#from wxPython._wx import false
import re
#import datetime
import time
##example = "(32010) 25/012504398888 24.10.2008 - 31.12.2008 Аветисян Ромелла Леонидовна 13.04.1982 1" ##Персона
#Регулярное выражение - не путать скобки с escape-бэкслэш и скобки обособления группы
#Совпадение персона (застрахованный)
log_per = r"\((\d{5})\)\s+(\S+)\s+(\d{2}.\d{2}.\d{4})[-\s]+(\d{2}.\d{2}.\d{4})[\s]+([-а-я,А-Я]+)\s+([-а-я,А-Я]+)\s+([-а-я,А-Я]*)\s+(\d{2}.\d{2}.\d{4}).+$"
#Совпадение строка-разделитель дублей
log_flag = r"^.+===========.+$"
ln=0 ##Номер строки (будем пересчитывать строки в файле)
is_r=False ##Есть ли наша контора в группе
i=0 ##Счетчик дублирующихся записей в группе
for line in open("32010.txt"):
ln = ln + 1
pr = re.findall(log_per, line) ##Проверяем - строка это застрахованный?
if len(pr)>0: ##Если это застрахованный
i = i+1 ##Строка дублирования
if pr[0][0] == "32010": ##Если это НАШ застрахованный
pr_r = pr ##Строка РОСНО
is_r = True ##РОСНО есть в этой группе
r_id = time.strptime(pr[0][2], "%d.%m.%Y") ##Дата страхования в нашей конторе
#print(pr[0][0], r_id)
else:
a_id = time.strptime(pr[0][2], "%d.%m.%Y") ##Дата страхования чужая
sa_id = pr[0][2]
#print(pr[0][0], a_id)
if ((i > 1) and (is_r == True)): ##Если не первый в группе и мы уже найдены
if (a_id > r_id): ##Если чужая дата выгоднее - больше
r_fail = True ##Тогда failure!!!
else:
r_fail = False
pr = re.findall(log_flag, line) ##Проверяем - не закончилась ли группа
if len(pr)>0: ##Если группа закончилась
##Считаем итоги, еще не обнулили
if ((i > 1) and (is_r == True)):
if (r_fail == True):
print("UPDATE INSURED SET DISMISSED = '%s' WHERE FAM = '%s' AND IM = '%s' AND OT = '%s' AND DR = '%s' AND DISMISSED IS NULL;") % (sa_id, pr_r[0][4], pr_r[0][5], pr_r[0][6], pr_r[0][7])
i = 0 ##Обнуляем счетчики дублирования
is_r = False ##Обнуляем флаг нашей конторы
Кстати, изначально флагом конца группы являлась не строка “==============…”, а отслеживалась смена фамилии-имени отчества:
if fio != pr[0][4]: ##То-есть, речь пошла о другом человеке
fio = pr[0][4] ##Запоминаем этого человека, обнуляем счетчик дублей, обнуляем наш флаг (есть ли мы, т.е. 32010, в этой группе и т.д.)