RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1410817
Accepted
Nigredo
Nigredo
Asked:2022-07-17 19:10:45 +0000 UTC2022-07-17 19:10:45 +0000 UTC 2022-07-17 19:10:45 +0000 UTC

解析支付订单 1C

  • 772

同事。

我需要解析从 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
python 1с
  • 3 3 个回答
  • 106 Views

3 个回答

  • Voted
  1. Best Answer
    eri
    2022-07-17T20:02:56Z2022-07-17T20:02:56Z
    text = open(file, 'r', encoding='Windows-1251').read()
    

    关键翻译可以更好地放在单独的字典中,以免从 if 中制作工作表,与某些字段的格式相同(如有必要):

    translators = {
       "Номер":"Number"
    }
    
    import datetime
    import decimal
    
    formaters = {
       "Дата": lambda value: datetime.datetime.strptime(value,"%d.%m.%Y").date(),
       "Сумма": lambda value: decimal.Decimal(value)
    }
    

    为了不相互嵌套循环,我取一个变量并将其放入文档标记末尾的结果中

    docpack = [  ]
    curdoc = {}
    
    for l in text.splitlines():
        print(repr(l))
        if l.startswith("КонецДокумента"):
           docpack.append(curdoc)
           curdoc = {}
           continue
        if l.startswith("КонецФайла"):
           break
        key, value = l.split("=", maxsplit=1)
        value = formaters.get(key, str)(value)
        key = translators.get(key, key)
        curdoc[key] = value
    
    import pprint
    pprint.pprint(docpack)
    

    如果需要排除不必要的键,则:

        key = translators.get(key, None)
        if key: curdoc[key] = value
    
    • 4
  2. Dmitry
    2022-07-17T19:53:52Z2022-07-17T19:53:52Z

    只要对任何参数没有数量上的限制,效率问题是值得商榷的。因此,如果没有明确的效率框架,就不可能回答这个问题:“如何更有效地实施?”。

    我将介绍我的版本,它并不声称是“最有效的”,但我是这样看的。

    我只会使用字典。会有2

    1. КонецДокумента从不包含两个实体的文件中读取КонецФайла.
      {
      "Документ": "Платежное поручение",
      "СекцияДокумент": "Платежное поручение",
      "Номер": "2",
      "Дата": "16.05.2022",
      ......
      }
      
    2. 一个映射字典,一个包含实体的模板ключ=ключНадоЗаменить,значение=ключЗамена。我不会写所有实体,例如,其余的你自己
      {
      "ПолучательСчет": "recip_CheckAcc",
      "Получатель1": "recip_Name",
      "ПолучательРасчСчет": "recip_CheckAcc",
      "ПолучательБанк1": "recip_BankName",
      ......
      }
      

    好吧,让我们开始吧

    # словарь шаблон
    pattern_dict = {
        "ПолучательСчет": "recip_CheckAcc",
        "Получатель1": "recip_Name",
        "ПолучательРасчСчет": "recip_CheckAcc",
        "ПолучательБанк1": "recip_BankName",
    }
    
    # читаем из файла и создаем словарь
    with open("t.txt", encoding="utf8") as file:
        doc_list = file.readlines()
        result = []
        doc_dict = {}
        for item in doc_list:
            if "=" in item:
                key, value = item.split("=")
                doc_dict[key] = value.strip()
            elif "КонецДокумента":
                result.append(doc_dict)
    
    # а это код замены ключей 
    for item_dict in result:
        for item in list(item_dict):
            if item in pattern_dict:
                item_dict[pattern_dict[item]] = item_dict.pop(item)
    

    输出将是这样的

    {
    .....
        "recip_CheckAcc": "40333333333333333333",
        "recip_Name": "Петров Петр Петрович",
        "recip_BankName": "ПАО СБЕРБАНК",
    .....
    }
    

    这种方法背后的基本原理是什么?您可以在代码之外明确定义替换。你有一本带替换的字典,你所需要的只是,例如,添加你需要的实体

    {
        "ПолучательСчет": "recip_CheckAcc",
        "Получатель1": "recip_Name",
        "Получатель2": "recip_Name",
        "Получатель": "recip_Name",
        "ПолучательРасчСчет": "recip_CheckAcc",
        "ПолучательБанк1": "recip_BankName1",
        "ПолучательБанк": "recip_BankName",
    }
    
    • 0
  3. wironxxx
    2022-08-29T04:05:55Z2022-08-29T04:05:55Z

    根据问题数据,我编写了自己的解析器,上传到 xslx 并绘制了平均每月营业额的图表,并附有详细评论: https ://github.com/Woldemarus/1cExchangeParserToXLSWithGraph

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5