阿里Rdf-File重构支持单文件多模板场景

rdf-file 简介

Rdf-File是一个处理结构化文本文件的工具组件 ,具体代码和文档地址为https://github.com/alipay/rdf-file

rdf-file 不足

  • 阿里的rdf-file 工具目前不支持单文件多模板的场景
  • 解析文件时候所需列数和文件实际的列数不一定要相等,而且有时候为了能够支持扩展性的问题,文件中内容可能会随时增加扩展字段,接收处理方应能向下兼容处理,即增加扩展字段后,对新增字段无需识别处理的用户,不需要升级系统

而对于上述这些场景在现实的应用中还比较常见,如下面对应的上交所对应的行情文件:
上交所对应的mktdt90.txt
HEADER|MTP1.00 |   1222085| 3201|        |XSHG01|20180801-10:46:03.780|0|T100    
MD001|000001|上证指数|           34228|    128759093.90|  4677.4600| 43558.6249| 43558.6249| 43383.4714| 43388.9018|     0.0000|        |10:45:39.290
MD001|000002|A股指数|           34227|    128758792.00|  4908.6860| 45817.6710| 45817.6710| 45633.3946| 45639.1083|     0.0000|        |10:45:39.290
MD002|330001|测试三  |               0|            0.00|   2370.090|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |00:00:00.000
MD002|330002|测试一  |               0|            0.00|    110.000|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |00:00:00.000
MD002|330007|测试一  |               0|            0.00|      5.000|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |00:00:00.000
MD003|010107|21国债⑺|             120|      1569588.00|   1307.990|   1307.990|   1307.990|   1307.990|   1307.990|      0.000|   1307.990|        1042|   1308.000|           3|   1307.000|           1|      0.000|           0|   1306.000|          22|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |10:26:38.020
MD003|010213|02国债⒀|               0|            0.00|    480.000|      0.000|      0.000|      0.000|      0.000|      0.000|    480.000|        1100|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |00:00:00.000
MD003|010303|03国债⑶|               0|            0.00|     99.000|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|T111    |00:00:00.000
MD004|502270|南方50  |               0|            0.00|      0.920|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|      0.000|T111    |00:00:00.000
MD004|502271|50A     |               0|            0.00|      1.047|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|      0.000|T111    |00:00:00.000
MD004|502272|50B     |               0|            0.00|      1.010|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|      0.000|T111    |00:00:00.000
MD004|502280|国泰基金|               0|            0.00|      1.005|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|      0.000|T111    |00:00:00.000
MD004|502281|国泰A   |               0|            0.00|      0.982|      0.000|      0.000|      0.000|      0.000|      0.000|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|           0|      0.000|      0.000|T111    |00:00:00.000
TRAILER|090

根据第一列字段的值对应不同的模板如下面说明:
MD001 == 指数
MD002 == 股票
MD003 == 债券
MD004 == 基金

rdf-file 扩展

为了能够解决单文件多模板的问题,扩展了rdf-file功能,使用的时候唯一不同的地方是文件模板的配置文件不同,如下面对比所示:

原始rdf-file 文件模板

{
    "head":[
         "totalCount|总笔数|Required|Long",
         "totalAmount|总金额|BigDecimal|Required"
    ],
    "body":[
         "seq|流水号",
         "instSeq|基金公司订单号|Required",
         "gmtApply|订单申请时间|Date:yyyy-MM-dd HH:mm:ss",
         "date|普通日期|Date:yyyyMMdd",
         "dateTime|普通日期时间|Date:yyyyMMdd HH:mm:ss",
         "applyNumber|普通数字|BigDecimal",
         "amount|金额|BigDecimal",
         "age|年龄|Integer",
         "longN|长整型|Long",
         "bol|布尔值|Boolean",
         "memo|备注"
    ],
    "tail": [
        "fileEnd|数据文件尾部字符",
        "date|普通日期|Date:yyyyMMdd",
        "amount|金额|BigDecimal"
    ],
    "protocol":"SP"
}

待解析文件内容如下:

100|300.03
seq_0|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
seq_2|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
seq_3|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
seq_4|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
seq_5|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
seq_6|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
seq_7|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
seq_8|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
seq_9|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
seq_10|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
OFDCFEND|20131109|100

扩展之后的rdf-file 文件模板

{
    "head":[
         "totalCount|总笔数|Required|Long",
         "totalAmount|总金额|BigDecimal|Required"
    ],
    "bodyTemplateConfigs":[
        {
            "name": "tempalte1",
            "templateCnds": [
                "type|类型|default:A"
            ],
            "templateColInfos": [
                "type|类型",
                "seq|流水号",
                "instSeq|基金公司订单号|Required",
                "gmtApply|订单申请时间|Date:yyyy-MM-dd HH:mm:ss",
                "date|普通日期|Date:yyyyMMdd",
                "dateTime|普通日期时间|Date:yyyyMMdd HH:mm:ss",
                "applyNumber|普通数字|BigDecimal",
                "amount|金额|BigDecimal",
                "age|年龄|Integer",
                "longN|长整型|Long",
                "bol|布尔值|Boolean",
                "memo|备注"
            ]
        },
        {
            "name": "tempalte2",
            "templateCnds": [
                "type|类型|default:B"
            ],
            "templateColInfos": [
                "type|类型",
                "seq|流水号",
                "instSeq|基金公司订单号|Required",
                "gmtApply|订单申请时间|Date:yyyy-MM-dd HH:mm:ss",
                "date|普通日期|Date:yyyyMMdd",
                "dateTime|普通日期时间|Date:yyyyMMdd HH:mm:ss",
                "applyNumber|普通数字|BigDecimal",
                "amount|金额|BigDecimal",
                "age|年龄|Integer",
                "longN|长整型|Long",
                "bol|布尔值|Boolean",
                "memo|备注",
                "addyjk|备注yjk"
            ]
        }
    ],
    "tail": [
        "fileEnd|数据文件尾部字符",
        "date|普通日期|Date:yyyyMMdd",
        "amount|金额|BigDecimal"
    ],
    "protocol":"SP"
}

待解析文件内容:

100|300.03
A|seq_0|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
A|seq_2|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
A|seq_3|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
A|seq_4|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
B|seq_5|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo|yjk
A|seq_6|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
A|seq_7|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
B|seq_8|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false||yjkx
A|seq_9|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|demo
A|seq_10|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
OFDCFEND|20131109|100

在同一个文件中有A,B两个不同的文件模板,为了能够支持这种场景只需要在配置文件中增加对应的配置和配置应用的条件即可,如上面对应的扩展配置文件模板。解析结果如下:

{totalAmount=300.03, totalCount=100}
{date=Sat Nov 09 00:00:00 CST 2013, dateTime=Tue Nov 12 12:23:34 CST 2013, amount=10.22, instSeq=inst_seq_0, longN=12345, memo=demo, gmtApply=Sat Nov 09 12:34:56 CST 2013, type=A, seq=seq_0, age=22, bol=true, applyNumber=23.33}
{date=Sun Nov 10 00:00:00 CST 2013, dateTime=Wed Nov 13 12:33:34 CST 2013, amount=11.88, instSeq=inst_seq_1, longN=56789, memo=null, gmtApply=Sun Nov 10 15:56:12 CST 2013, type=A, seq=seq_2, age=33, bol=false, applyNumber=23.34}
{date=Sat Nov 09 00:00:00 CST 2013, dateTime=Tue Nov 12 12:23:34 CST 2013, amount=10.22, instSeq=inst_seq_0, longN=12345, memo=demo, gmtApply=Sat Nov 09 12:34:56 CST 2013, type=A, seq=seq_3, age=22, bol=true, applyNumber=23.33}
{date=Sun Nov 10 00:00:00 CST 2013, dateTime=Wed Nov 13 12:33:34 CST 2013, amount=11.88, instSeq=inst_seq_1, longN=56789, memo=null, gmtApply=Sun Nov 10 15:56:12 CST 2013, type=A, seq=seq_4, age=33, bol=false, applyNumber=23.34}
{date=Sat Nov 09 00:00:00 CST 2013, dateTime=Tue Nov 12 12:23:34 CST 2013, amount=10.22, memo=demo, type=B, addyjk=yjk, instSeq=inst_seq_0, longN=12345, gmtApply=Sat Nov 09 12:34:56 CST 2013, seq=seq_5, age=22, bol=true, applyNumber=23.33}
{date=Sun Nov 10 00:00:00 CST 2013, dateTime=Wed Nov 13 12:33:34 CST 2013, amount=11.88, instSeq=inst_seq_1, longN=56789, memo=null, gmtApply=Sun Nov 10 15:56:12 CST 2013, type=A, seq=seq_6, age=33, bol=false, applyNumber=23.34}
{date=Sat Nov 09 00:00:00 CST 2013, dateTime=Tue Nov 12 12:23:34 CST 2013, amount=10.22, instSeq=inst_seq_0, longN=12345, memo=demo, gmtApply=Sat Nov 09 12:34:56 CST 2013, type=A, seq=seq_7, age=22, bol=true, applyNumber=23.33}
{date=Sun Nov 10 00:00:00 CST 2013, dateTime=Wed Nov 13 12:33:34 CST 2013, amount=11.88, memo=null, type=B, addyjk=yjkx, instSeq=inst_seq_1, longN=56789, gmtApply=Sun Nov 10 15:56:12 CST 2013, seq=seq_8, age=33, bol=false, applyNumber=23.34}
{date=Sat Nov 09 00:00:00 CST 2013, dateTime=Tue Nov 12 12:23:34 CST 2013, amount=10.22, instSeq=inst_seq_0, longN=12345, memo=demo, gmtApply=Sat Nov 09 12:34:56 CST 2013, type=A, seq=seq_9, age=22, bol=true, applyNumber=23.33}
{date=Sun Nov 10 00:00:00 CST 2013, dateTime=Wed Nov 13 12:33:34 CST 2013, amount=11.88, instSeq=inst_seq_1, longN=56789, memo=null, gmtApply=Sun Nov 10 15:56:12 CST 2013, type=A, seq=seq_10, age=33, bol=false, applyNumber=23.34}
{date=Sat Nov 09 00:00:00 CST 2013, amount=100, fileEnd=OFDCFEND}

使用

和原来rdf-file使用方法一样

源码地址

扩展的rdf-file 源码地址:https://github.com/lwjaiyjk/rdf-file

参考

  1. https://github.com/alipay/rdf-file

你可能感兴趣的:(阿里Rdf-File重构支持单文件多模板场景)