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

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

作者: 瑜骐 | 来源:发表于2018-09-29 17:14 被阅读0次

    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重构支持单文件多模板场景

          本文链接:https://www.haomeiwen.com/subject/narboftx.html