Skip to content

读文件之多文件有序读

quhongwei edited this page Mar 28, 2018 · 1 revision

多个完整文件有序读取,文件头,文件尾根据汇总字段配置汇总

一:文件内容

  1. 第一个文件
总笔数: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
  1. 第二个文件
总笔数: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
  1. 第三个文件
总笔数: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);

Clone this wiki locally