如何将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
相关产品推荐
相关产品推荐

