读取MT940文件数据存入数据库及字段解析方法咨询
MT940文件解析与入库实现方案
整体解析思路
不建议手动按固定位置截取字段,MT940是SWIFT定义的标准对账格式,有成熟的第三方解析库可以直接调用,能覆盖绝大多数银行的格式变种,省去自己处理字段边界的麻烦。
以下以Python场景为例给出完整实现,其他技术栈也有对应可用库:Java可使用Apache Camel MT940组件,Node.js可使用mt940-js包。
完整代码示例
1. 依赖安装
使用成熟的mt940解析库,执行命令:pip install mt940
2. 解析+入库全流程代码
import mt940 import sqlite3 # 第一步:解析本地MT940文件 parsed_data = mt940.parse("你的文件路径.mt940") # 第二步:初始化数据库连接(示例用sqlite,可替换为MySQL、PostgreSQL等) db_conn = sqlite3.connect("finance_data.db") cursor = db_conn.cursor() # 第三步:创建交易数据表,可根据实际需要扩展字段 cursor.execute(""" CREATE TABLE IF NOT EXISTS mt940_trade_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, value_date TEXT NOT NULL, entry_date TEXT, trade_amount REAL NOT NULL, currency_code TEXT, trade_type_code TEXT, customer_reference TEXT, bank_reference TEXT ) """) # 第四步:遍历解析后的交易数据写入数据库 for trade in parsed_data: trade_data = trade.data cursor.execute(""" INSERT INTO mt940_trade_records ( value_date, entry_date, trade_amount, currency_code, trade_type_code, customer_reference, bank_reference ) VALUES (?, ?, ?, ?, ?, ?, ?) """, ( trade_data.get("value_date", "").strftime("%Y%m%d") if trade_data.get("value_date") else "", trade_data.get("entry_date", "").strftime("%m%d") if trade_data.get("entry_date") else "", trade_data.get("amount", 0), trade_data.get("currency", ""), trade_data.get("transaction_type", ""), trade_data.get("customer_reference", "").strip(), trade_data.get("bank_reference", "").strip() )) db_conn.commit() db_conn.close()
单独提取:61字段客户参考号的方案
如果不想引入第三方库,针对你提到的客户参考号位置不固定的问题,可通过正则匹配字段边界实现,不需要按固定位置截取:
核心逻辑
MT940的:61字段是标准结构化字段,规则为::61:[价值日期(6位)][入账日期(可选4位)][借贷标识(C/D)][交易金额][交易类型码(3位)][客户参考号]//[银行参考号]
客户参考号的边界固定为:3位交易类型码之后,//分隔符之前,所以只需要匹配前半段固定结构,直接切出中间内容即可。
代码示例
import re sample_line = ":61:2009230923D4086,74NDDTNONREF //NONREF" # 匹配前半段固定结构 fixed_part_pattern = r":61:(\d{6})(\d{4})?([CD])([\d,]+\d)([A-Z0-9]{3})" match_result = re.match(fixed_part_pattern, sample_line) if match_result: # 取固定结构结束位置到//之前的内容,去除首尾空白即为客户参考号 fixed_part_end = match_result.end() double_slash_pos = sample_line.index("//") customer_ref = sample_line[fixed_part_end:double_slash_pos].strip() print(customer_ref) # 输出结果:NONREF
注意事项
- 部分银行的MT940格式会有细微自定义调整,首次使用时可先打印解析后的全量字段,确认字段映射关系正确后再执行入库
- 遇到非标准格式的变种,仅需要微调正则匹配规则即可适配,不需要修改整体处理逻辑
内容的提问来源于stack exchange,提问作者Bin
相关产品推荐
相关产品推荐

