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

读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:18:03