同事。
我需要解析从 1C 下载的支付订单,如下所示:
Документ=Платежное поручение
СекцияДокумент=Платежное поручение
Номер=1
Дата=16.05.2022
Сумма=888.88
ПлательщикСчет=03111111111111111111
Плательщик=ИНН 9777777777 ООО "Рога&Копыта"
ПлательщикИНН=9777777777
Плательщик1=ООО "Рога&Копыта"
ПлательщикРасчСчет=03111111111111111111
ПлательщикБанк1=УФК ПО Г. МОСКВЕ
ПлательщикБанк2=г. Москва
ПлательщикБИК=004444444
ПлательщикКорсчет=40101111111111111111
ПолучательСчет=40222222222222222222
Получатель=ИНН 000000000000 Иванов Иван Иванович
ПолучательИНН=000000000000
Получатель1=Иванов Иван Иванович
ПолучательРасчСчет=40222222222222222222
ПолучательБанк1=ПАО СБЕРБАНК
ПолучательБанк2=г. Москва
ПолучательБИК=044525225
ПолучательКорсчет=30101111111111111111
КодНазПлатежа=1
ВидОплаты=01
ПлательщикКПП=772222222
Очередность=3
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=2
Дата=16.05.2022
Сумма=7777.77
ПлательщикСчет=03111111111111111111
Плательщик=ИНН 9777777777 ООО "Рога&Копыта"
ПлательщикИНН=9777777777
Плательщик1=ООО "Рога&Копыта"
ПлательщикРасчСчет=03111111111111111111
ПлательщикБанк1=УФК ПО Г. МОСКВЕ
ПлательщикБанк2=г. Москва
ПлательщикБИК=004444444
ПлательщикКорсчет=40101111111111111111
ПолучательСчет=40333333333333333333
Получатель=ИНН 000000000000 Петров Петр Петрович
ПолучательИНН=000000000000
Получатель1=Петров Петр Петрович
ПолучательРасчСчет=40333333333333333333
ПолучательБанк1=ПАО СБЕРБАНК
ПолучательБанк2=г. Москва
ПолучательБИК=044525225
ПолучательКорсчет=30102222222222222222
КодНазПлатежа=1
ВидОплаты=01
ПлательщикКПП=772222222
Очередность=3
КонецДокумента
КонецФайла
像这样实现解析:
def collect_pay_info(file) -> list:
result = []
with open(file, 'r', encoding='Windows-1251') as f:
tmp = f.readline().strip()
while 'КонецФайла' not in tmp:
data = {'docNum': '',
'docDate': datetime.now().strftime('%Y-%m-%d'),
'paySum': '',
'sumNds': '0.00',
'recip_Name': '',
'recip_CheckAcc': '',
'recip_BIK': '',
'recip_BankName': '',
'recip_CorrAcc': ''}
while 'КонецДокумента' not in tmp:
if 'ПолучательСчет=' in tmp:
data['recip_CheckAcc'] = tmp.strip().split('=')[1]
if 'Получатель1=' in tmp:
data['recip_Name'] = tmp.strip().split('=')[1]
if 'ПолучательРасчСчет=' in tmp:
data['recip_CheckAcc'] = tmp.strip().split('=')[1]
if 'ПолучательБанк' in tmp:
data['recip_BankName'] = tmp.strip().split('=')[1]
if 'ПолучательБИК=' in tmp:
data['recip_BIK'] = tmp.strip().split('=')[1]
if 'ПолучательКорсчет=' in tmp:
data['recip_CorrAcc'] = tmp.strip().split('=')[1]
if 'Сумма=' in tmp:
data['paySum'] = tmp.strip().split('=')[1]
tmp = f.readline().strip()
result.append(data)
tmp = f.readline().strip()
return result
我知道可以更有效地实施,但是没有足够的经验。请告诉我如何改进我的代码。提前致谢。
非常感谢大家的帮助!结果:
from datetime import datetime
def collect_pay_info(file):
translators = {
'Дата': 'docDate',
'ПолучательСчет': 'recip_CheckAcc',
'Получатель1': 'recip_Name',
'ПолучательРасчСчет': 'recip_CheckAcc',
'ПолучательБанк1': 'recip_BankName',
'ПолучательБИК': 'recip_BIK',
'ПолучательКорсчет': 'recip_CorrAcc',
'Сумма': 'paySum',
}
formaters = {
'Дата': datetime.now().strftime('%Y-%m-%d'),
}
docpack = []
curdoc = {}
text = open(file, 'r', encoding='Windows-1251').read()
for line in text.splitlines()[1:]:
if line.startswith('КонецДокумента'):
docpack.append(curdoc)
curdoc = {}
continue
if line.startswith('КонецФайла'):
break
key, value = line.split('=', maxsplit=1)
value = formaters.get(key, value)
key = translators.get(key, None)
if key:
curdoc[key] = value
return docpack
关键翻译可以更好地放在单独的字典中,以免从 if 中制作工作表,与某些字段的格式相同(如有必要):
为了不相互嵌套循环,我取一个变量并将其放入文档标记末尾的结果中
如果需要排除不必要的键,则:
只要对任何参数没有数量上的限制,效率问题是值得商榷的。因此,如果没有明确的效率框架,就不可能回答这个问题:“如何更有效地实施?”。
我将介绍我的版本,它并不声称是“最有效的”,但我是这样看的。
我只会使用字典。会有2
КонецДокумента
从不包含两个实体的文件中读取КонецФайла
.ключ=ключНадоЗаменить
,значение=ключЗамена
。我不会写所有实体,例如,其余的你自己好吧,让我们开始吧
输出将是这样的
这种方法背后的基本原理是什么?您可以在代码之外明确定义替换。你有一本带替换的字典,你所需要的只是,例如,添加你需要的实体
根据问题数据,我编写了自己的解析器,上传到 xslx 并绘制了平均每月营业额的图表,并附有详细评论: https ://github.com/Woldemarus/1cExchangeParserToXLSWithGraph