Rdf-File根据协议布局模板和数据定义模板,来进行文件的解析与生成。通过协议布局和数据定义模板,能够明确计算出头尾占用的行数,这样可以更精确的分离出head,body,tail。
目前组件实现的协议布局模板可以分为如下两大类:
开放式基金业务数据交换协议 这种国家标准文件, 数据是以补位后定长形式展示的。 存在缺点有:
文件虽然是文本格式,但是内容肉眼无法看懂。
定长补位导致文件存储浪费。
因为是国家标准,文件内容定义十分全面,但是实际标准定义了六七十个字段, 有用的就十来个, 没用的字段也需要占用存储空间。
字段通过分隔符分割, 字段内容由交互双方约定。优点是用多少就占用多少,缺点是各方文件格式、内容差异可能比较大。
数据定义模板用来定义数据字段类型,分割符,采用哪种协议等等。
{
"head":[
"totalCount|总笔数|Required|Integer",
"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|数据文件尾部字符|default:OFDCFEND"
],
"protocol":"SP",
"summaryColumnPairs":[
"totalAmount|amount"
],
"columnSplit":"|@|",
"lineBreak": "\r",
"startWithSplit": "body",
"endWithSplit": "head|body|tail",
"rowValidators": [
"com.alipay.rdf.file.validator.RowValidateExample"
]
}
组件配置项 | 配置描述 |
---|---|
head | 定义头部字段。 |
body | 定义数据字段。 |
tail | 定义尾部字段,定义必须有,但是数据文件可以不包含尾部数据。 |
字段配置 | 字段定义通过| 分割,字段第一个必须是字段名name,第二个必须是描述desc,后面属性没有固定顺序(Required、数据类型type、长度范围ranage、默认值default、日期类型等) |
fileEncoding | 定义文件编码, 赋值给TemplateConfig.fileEncoding, 优先级 fileConfig.fileEncoding > TemplateConfig.fileEncoding > FileDefaultConfig.DEFAULT_FILE_ENCONDIG |
columnSplit | 文件数据分割符, 默认是| |
lineBreak | 生成文件行换行符,默认 \r\n |
startWithSplit | startWithSplit =head|body|tail, 意思是在 head ,body, tail 行数据开始将分隔符添上 |
endWithSplit | endWithSplit = body|tail ,意思是在 body, tail 行数据尾部将分隔符添上 |
protocol | 指定文件协议(布局格式) |
summaryColumnPairs | 汇总字段, 读过程中行字段汇总可以和文件头中比较, 写过程中汇总行字段,最后可以写到头分片中 |
rowValidators | 业务配置的行校验器,读写过程中回调 |
字段类型 | 配置描述 |
---|---|
String | java.lang.String |
Long | java.lang.Long |
Integer | java.lang.Integer |
Float | java.lang.Float |
Double | java.lang.Double |
Date | java.util.Date 示例:dateTime|普通日期时间|Date:yyyyMMdd HH:mm:ss |
BigDecimal | java.math.BigDecimal |
DigitalChar | java.lang.String 数值型字符串,都是数字 |
Boolean | java.lang.Boolean |
SP是简单格式simple的意思。
<protocol name="sp">
<head>
<row>
<column>
<output>${column.value()}output>
column>
row>
head>
<body>
<row>
<column>
<output>${column.value()}output>
column>
row>
body>
<tail>
<row>
<column>
<output>${column.value()}output>
column>
row>
tail>
protocol>
{
"head": [
"totalCount|总笔数|Required|Integer",
"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|数据文件尾部字符|default:OFDCFEND"
],
"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|备注1
seq_1|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
OFDCFEND
DE是余额宝与天弘交互格式,作为一种默认实现。
<protocol name="de">
<head>
<row>
<column>
<output>${column.desc()}output>
<output>:output>
<output>${column.value()}output>
column>
row>
<row output="${bodycolumn.horizontal(desc)}" />
head>
<body>
<row>
<column>
<output>${column.value()}output>
column>
row>
body>
<tail>
<row>
<column>
<output>${column.value()}output>
column>
row>
tail>
protocol>
字段描述:字段值
在由分隔符连接而成。横向
打印出body的字段描述
。{
"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|备注"
],
"protocol":"DE"
}
总笔数:2|总金额:300.03
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_0|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|123|true|备注1
seq_1|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
国家标准:开放式基金业务数据交换协议
<protocol name="fund" rowsplit="rowSplitByFixedlLength">
<head>
<row columnLayout="vertical">
<column>
<output>${column.value()}output>
column>
row>
<row output="${bodycolumn.count()}" type="Integer|[3,0]" />
<row output="${bodycolumn.vertical(name)}" />
<row output="${totalCount}" type="Integer|[8,0]" />
head>
<body>
<row>
<column>
<output>${column.value()}output>
column>
row>
body>
<tail>
<row>
<column>
<output>${column.value()}output>
column>
row>
tail>
protocol>
定长
而不是通过分隔符分割的,不足的补0
。name
用于指定协议名字,rowsplit
属性指定数据字段的分割方式。bodycolumn.count()
是组件实现的内置列的数量。bodycolumn.vertical(name)}
输出列的字段名
。totalCount
组件内置变量,不用在数据定义模板中定义,数据行数
。type
属性定义变量的类型和长度。{
"head":[
"identity|信息标识|[8,0]|default:OFDCFDAT",
"version|协议版本号|[4,0]|default:20",
"msgCreator|信息创建人|[9,0]|default:H0",
"msgRecipient|信息接收人|[9,0]",
"sendDate|传送发生日期|[8,0]|Date:yyyyMMdd",
"summaryTableNo|汇总表号|[3,0]",
"fileTypeCode|文件类型代码 |[2,0]",
"sender|发送人|[8,0]|default:H0",
"recipient|接收人|[8,0]"
],
"body":[
"TransactionCfmDate|对帐日期|[8,0]|Date:yyyyMMdd",
"FundCode|基金代码|[8,0]",
"AvailableVol|基金可用份数|BigDecimal|[6,2]"
],
"tail":[
"fileEnd|数据文件尾部字符|default:OFDCFEND|[8,0]"
],
"protocol":"FUND"
}
Map<String, Object> head = new HashMap<String, Object>();
head.put("msgRecipient", "xxx");
head.put("sendDate", "20231122");
head.put("summaryTableNo", "aa");
head.put("fileTypeCode", "bb");
head.put("recipient", "ll");
head.put("totalCount", 1);
Map<String, Object> row = new HashMap<String, Object>();
row.put("TransactionCfmDate", "20231122");
row.put("FundCode", "中国1");
// Integer|[6,2] 总长度6位,小数点2位,输出"004211"
row.put("AvailableVol", 42.11);
OFDCFDAT
20
H0
xxx
20231122
aa
bb
H0
ll
003
TransactionCfmDate
FundCode
AvailableVol
00000001
20231122中国1 004211
OFDCFEND
fund_index body数据不是定长数据。
<protocol name="fund_index" rowsplit="rowSplitByFixedlLength">
<head>
<row columnLayout="vertical">
<column>
<output>${column.value()}output>
column>
row>
<row output="${totalCount}" type="Integer|[3,0]" />
head>
<body>
<row columnLayout="vertical">
<column>
<output>${column.value()}output>
column>
row>
body>
<tail>
<row>
<column>
<output>${column.value()}output>
column>
row>
tail>
protocol>
{
"head": [
"identity|信息标识|[8,0]|default:OFDCFIDX",
"version|协议版本号|[4,0]|default:20",
"msgCreator|信息创建人|[9,0]|default:H0",
"msgRecipient|信息接收人|[9,0]",
"sendDate|传送发生日期|[8,0]|Date:yyyyMMdd"
],
"body": [
"path|基金文件路径"
],
"tail": [
"fileEnd|数据文件尾部字符|default:OFDCFEND|[8,0]"
],
"protocol": "FUND_INDEX"
}
OFDCFIDX
20
H0
xxx
20180302
003
aaa/xxx/ccc
bbb/xxx/ccc
ccc/xxx/ccc
OFDCFEND