-
Notifications
You must be signed in to change notification settings - Fork 74
读文件之多文件有序读
quhongwei edited this page Mar 28, 2018
·
1 revision
多个完整文件有序读取,文件头,文件尾根据汇总字段配置汇总
- 第一个文件
总笔数:3|总数字:62
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_1|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|12|23.33|22|12345|true|备注1
seq_33|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|20|100.21|22|12345|true|备注2
seq_12|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|30|22.00|22|12345|true|备注3
145.54
- 第二个文件
总笔数:2|总数字:70
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_17|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|10|11.00|22|12345|true|备注1de2
seq_23|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|60|00.10|22|12345|true|备注2de2
11.10
- 第三个文件
总笔数:0|总数字:0
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
0.00
{
"head":[
"totalCount|总笔数|Required|BigDecimal",
"totalNumber|总数字|Required|BigDecimal"
],
"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": [
"totalAmount|总金额|BigDecimal|Required"
],
"protocol":"DE",
"lineBreak":"\r\n",
"summaryColumnPairs":[
"totalAmount|amount",
"totalNumber|applyNumber"
]
}
DE组件内置协议
// FileConfig没有定义文件路径,多个文件没法定义
FileConfig fileConfig = new FileConfig("/sortedreader/de/de2.json",
new StorageConfig("nas"));
// 多文件排序类型设置
fileConfig.setType(FileCoreToolContants.PROTOCOL_MULTI_FILE_SORTER);
ProtocolFilesSortedReader reader = (ProtocolFilesSortedReader) FileFactory
.createReader(fileConfig);
FileSorter fileSorter = (FileSorter) reader;
// 排序参数, 分片不合并
SortConfig sortConfig = new SortConfig(sortTempPath, SortTypeEnum.ASC, executor,
ResultFileTypeEnum.SLICE_FILE_PATH);
sortConfig.setResultFileName("testSort");
sortConfig.setSliceSize(1024);
sortConfig.setSortIndexes(new int[] { 0, 1 }); // 设置排序字段的索引
String[] sourceFilePaths = new String[3];
sourceFilePaths[0] = File.class.getResource("/sortedreader/de/data2/de1.txt").getPath();
sourceFilePaths[1] = File.class.getResource("/sortedreader/de/data2/de2.txt").getPath();
sourceFilePaths[2] = File.class.getResource("/sortedreader/de/data2/de3.txt").getPath();
// 跟一个文件排序不同, 多文件排序这里需要设置分片来源
sortConfig.setSourceFilePaths(sourceFilePaths);
// 先排序
fileSorter.sort(sortConfig);
// 读取头数据
Map<String, Object> head = reader.readHead(HashMap.class);
Assert.assertEquals(2, head.size());
Assert.assertEquals(new BigDecimal(5), head.get("totalCount"));
Assert.assertEquals(new BigDecimal(132), head.get("totalNumber"));
//读取尾部数据
Map<String, Object> tail = reader.readTail(HashMap.class);
Assert.assertEquals(1, tail.size());
Assert.assertEquals(new BigDecimal("156.64"), tail.get("totalAmount"));
// 读取body数据
Map<String, Object> row = reader.readRow(HashMap.class);
Assert.assertEquals("seq_1", row.get("seq"));
Assert.assertEquals(new BigDecimal("23.33"), row.get("amount"));
row = reader.readRow(HashMap.class);
Assert.assertEquals("seq_12", row.get("seq"));
Assert.assertEquals(new BigDecimal("22.00"), row.get("amount"));
row = reader.readRow(HashMap.class);
Assert.assertEquals("seq_17", row.get("seq"));
Assert.assertEquals(new BigDecimal("11.00"), row.get("amount"));
row = reader.readRow(HashMap.class);
Assert.assertEquals("seq_23", row.get("seq"));
Assert.assertEquals(new BigDecimal("00.10"), row.get("amount"));
row = reader.readRow(HashMap.class);
Assert.assertEquals("seq_33", row.get("seq"));
Assert.assertEquals(new BigDecimal("100.21"), row.get("amount"));
row = reader.readRow(HashMap.class);
Assert.assertNull(row);