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

使用Prowide解析含多个以$分隔的SWIFT MT940/MT950报文时输出不完整的问题求助

使用Prowide解析含多个以$分隔的SWIFT MT940/MT950报文时输出不完整的问题求助

大家好,我最近在处理旧的SWIFT报文,重点是解析MT940和MT950类型的报文。目前遇到一个棘手的问题:我的单个报文文件里可能包含多个不同类型的SWIFT报文,它们之间用$符号分隔,但用Prowide-core库解析时,输出的结果不完整,只获取到了第一个报文的部分内容;而用swift-parser-py工具解析同一个文件,却能正确得到完整的MT950报文数据。

下面是我的相关测试内容,麻烦各位帮忙分析一下问题所在:

测试用的sample.txt文件内容

{1:F21CITIUS33AGFX7239256290}{4:{177:2507150853}{451:0}}{1:F01CITIUS33AGFX7239256290}{2:O9500153250715SBOSUS3UFIMS13447057842507150853N}{4:
:20:2507150000118899
:25:PFZM
:28C:138/1
:60F:C250714USD53944,66
:61:2507130714CD2725,28NSALSCTRSC000004FWHL//25GFKBBPF0P
/ISIN/US0001200901/SHS/12148,
:62F:C250714USD56669,94
:64:C250714USD56669,94
-}{5:{CHK:F0FC1309E8AB}}{S:{COP:P}{MDG:B7D497E702BC8EE8EDBFBCBDACF30DB07A7352E76BE40274B87FC17253462868}}%

我编写的SwiftDemo.java代码

import com.prowidesoftware.swift.io.parser.SwiftParser;
import com.prowidesoftware.swift.model.SwiftMessage;

public class SwiftDemo {
    public static void main(String[] args) throws Exception {
        String path = "sample.txt";
        String fin = java.nio.file.Files.readString(java.nio.file.Paths.get(path), java.nio.charset.StandardCharsets.UTF_8);
        SwiftParser parser = new SwiftParser(fin);
        SwiftMessage sm = parser.message();
        System.out.println(sm.toJson());
    }
}

Prowide-core的解析结果

{
  "timestamp": "2025-08-30T19:49:12Z",
  "version": 2,
  "data": {
    "block1": {
      "applicationId": "F",
      "serviceId": "21",
      "logicalTerminal": "CITIUS33AGFX",
      "sessionNumber": "7239",
      "sequenceNumber": "256290"
    },
    "block4": {
      "tags": [
        {
          "name": "177",
          "value": "2507150853"
        },
        {
          "name": "451",
          "value": "0"
        }
      ]
    }
  }
}

swift-parser-py的解析结果

{
  "block1": {
    "block_id": 1,
    "content": "F01CITIUS33AGFX7239256290",
    "application_id": "F",
    "service_id": "01",
    "receiving_lt_id": "CITIUS33AGFX",
    "session_number": "7239",
    "sequence_number": "256290"
  },
  "block4": {
    "name": "4",
    "content": [
      "\n:20:2507150000118899\n:25:PFZM\n:28C:138/1\n:60F:C250714USD53944,66\n:61:2507130714CD2725,28NSALSCTRSC000004FWHL//25GFKBBPF0P\n/ISIN/US0001200901/SHS/12148,\n:62F:C250714USD56669,94\n:64:C250714USD56669,94\n-"
    ],
    "fields": [
      {
        "type": "20",
        "option": "",
        "fieldValue": "2507150000118899",
        "content": ":20:2507150000118899",
        "ast": {
          "Reference Number": "2507150000118899"
        }
      },
      {
        "type": "25",
        "option": "",
        "fieldValue": "PFZM",
        "content": ":25:PFZM",
        "ast": {
          "Account": "PFZM"
        }
      },
      {
        "type": "28",
        "option": "C",
        "fieldValue": "138/1",
        "content": ":28C:138/1",
        "ast": {
          "Statement Number": "138",
          "Sequence Number": "1"
        }
      },
      {
        "type": "60",
        "option": "F",
        "fieldValue": "C250714USD53944,66",
        "content": ":60F:C250714USD53944,66",
        "ast": {
          "D/C Mark": "C",
          "Date": "250714",
          "Currency": "USD",
          "Amount": "53944,66"
        }
      },
      {
        "type": "61",
        "option": "",
        "fieldValue": ":2507130714CD2725,28NSALSCTRSC000004FWHL//25GFKBBPF0P\n/ISIN/US0001200901/SHS/12148,",
        "content": ":61::2507130714CD2725,28NSALSCTRSC000004FWHL//25GFKBBPF0P\n/ISIN/US0001200901/SHS/12148,",
        "ast": {
          "value": "2507130714CD2725,28NSALSCTRSC000004FWHL//25GFKBBPF0P\n/ISIN/US0001200901/SHS/12148,"
        }
      },
      {
        "type": "62",
        "option": "F",
        "fieldValue": "C250714USD56669,94",
        "content": ":62F:C250714USD56669,94",
        "ast": {
          "D/C Mark": "C",
          "Date": "250714",
          "Currency": "USD",
          "Amount": "56669,94"
        }
      },
      {
        "type": "64",
        "option": "",
        "fieldValue": "C250714USD56669,94",
        "content": ":64:C250714USD56669,94",
        "ast": {
          "D/C Mark": "C",
          "Date": "250714",
          "Currency": "USD",
          "Amount": "56669,94"
        }
      }
    ]
  },
  "block2": {
    "content": "O9500153250715SBOSUS3UFIMS13447057842507150853N"
  }
}

可以看到,Prowide只解析到了第一个以{1:F21...}开头的报文片段,而后面的MT950报文完全没有被解析出来;但python工具却正确识别到了完整的MT950内容。我是不是在使用Prowide的时候遗漏了什么步骤?比如没有处理多报文分隔符$的逻辑?还是Prowide需要特定的配置才能支持多报文文件的解析?

麻烦各位大佬指点一下,谢谢!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 08:43:10