You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MT202 SWIFT报文解析转换为Python pandas DataFrame

MT202 SWIFT报文转Pandas DataFrame实现方法

实现思路

SWIFT MT报文为分层块结构,核心需完成两个解析逻辑:

  • 拆分外层的报文头块(基础头{1}、应用头{2}、用户头{3})
  • 处理正文块{4}内的标签(Tag),兼容单行、多行标签的取值逻辑

完整实现代码

首先导入依赖库:

import pandas as pd
import re

定义解析函数和测试逻辑:

def parse_swift_mt202(swift_content):
    # 初始化结果字典
    result = {}
    # 1. 解析外层块
    # 匹配所有{...}格式的顶层块
    outer_blocks = re.findall(r'\{([1-5]):(.*?)\}(?=\{|$)', swift_content, re.DOTALL)
    for block_id, block_content in outer_blocks:
        if block_id == '1':
            # 基础头解析
            result['basic_header'] = block_content
        elif block_id == '2':
            # 应用头解析,I202对应MT202报文
            result['app_header'] = block_content
            result['msg_type'] = block_content[1:4] if block_content.startswith('I') else None
        elif block_id == '3':
            # 用户头解析,拆分成子标签
            sub_tags = re.findall(r'\{(\d+):(.*?)\}', block_content)
            for tag, val in sub_tags:
                result[f'user_tag_{tag}'] = val
        elif block_id == '4':
            # 正文块解析,处理多行标签
            lines = [line.strip() for line in block_content.splitlines() if line.strip() and line.strip() != '-']
            current_tag = None
            current_value = []
            tag_pattern = re.compile(r'^:([A-Z0-9]+):(.*)$')
            for line in lines:
                tag_match = tag_pattern.match(line)
                if tag_match:
                    # 遇到新标签,先保存上一个标签的内容
                    if current_tag:
                        result[current_tag] = '\n'.join(current_value).strip()
                    current_tag = tag_match.group(1)
                    current_value = [tag_match.group(2)] if tag_match.group(2) else []
                else:
                    # 多行内容,追加到当前标签值
                    if current_tag:
                        current_value.append(line)
            # 保存最后一个标签
            if current_tag:
                result[current_tag] = '\n'.join(current_value).strip()
    return result

# 传入样例报文
swift_msg = """{1:F01ABC1234567890000000000}{2:I202XYZ12345678XN}{3:{108:PU8AZEGXLFAK53LA}{111:001}{121:ea004539-82d9-4fb3-93dc-23121ff34f91}}{4:
:20:PQRST12345678912
:21:PQRST12345678912
:32A:200609USD7833,25
:57A:BBBBBB44
:58A:AAAAAAAA
:50K:/CH720023023054423061B
TEST TEST DATA
TEST  TEST DATA 25
WORLD UK LONDON
:52A:ABC12345678
:57A:AAAAAAAA
:59:/123456789
TEST TEST
:70:REG.TEST TEST TEST
:33B:USD7833,25
-}"""

# 解析报文
parsed_data = parse_swift_mt202(swift_msg)
# 转DataFrame,单条报文转置后可读性更强
df = pd.DataFrame([parsed_data]).T.reset_index()
df.columns = ['标签/字段', '值']
print(df)

可选拓展处理

如果需要进一步格式化字段,可新增以下逻辑:

  • 金额字段(如32A、33B):拆分出日期、币种、金额,把金额中的逗号替换为小数点后转为数值类型
  • 日期字段:转换为YYYY-MM-DD的标准日期格式
  • 多行文本字段:可根据需求替换换行符为空格

内容的提问来源于stack exchange,提问作者Prasoon Shukla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:54:03