Skip to content

文件合并

quhongwei edited this page Mar 28, 2018 · 1 revision

文件合并使用场景,一般在分布式环境下导出文件,如分库分表下每个表导出一个分片文件,最后合成一个完整文件
文件合并支持: 文件头, 文件body,文件尾,完整文件, 不同存储文件的合并

一:数据定义模板

{
 	"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|数据文件尾部字符",
    	"date|普通日期|Date:yyyyMMdd",
    	"amount|总金额|BigDecimal"
    ],
    "protocol":"DE",
    "summaryColumnPairs":[
    	"totalAmount|amount",
    	"amount|amount"
    ]
}

二: 文件内容

de_all1.txt

总笔数: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|20131109|100

de_all2.txt

总笔数:100|总金额:300.11
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_2|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|备注1
seq_3|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
OFDCFEND|20131109|12

de_all3.txt

总笔数:100|总金额:300.12
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_10|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|备注1
seq_11|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
OFDCFEND|20131109|211

三:代码示例

       String filePath = tf.getRoot().getAbsolutePath();
        System.out.println(filePath);
        FileConfig fileConfig = new FileConfig(new File(filePath, "test.txt").getAbsolutePath(),
            "/meger/template/de2.json", new StorageConfig("nas"));
        FileMerger fileMerger = FileFactory.createMerger(fileConfig);
        MergerConfig mergerConfig = new MergerConfig();
        List<String> existFilePaths = new ArrayList<String>();
        existFilePaths.add(File.class.getResource("/meger/data/de_all1.txt").getPath());
        existFilePaths.add(File.class.getResource("/meger/data/de_all2.txt").getPath());
        existFilePaths.add(File.class.getResource("/meger/data/de_all3.txt").getPath());
        mergerConfig.setExistFilePaths(existFilePaths);
        fileMerger.merge(mergerConfig);
        FileReader reader = FileFactory.createReader(fileConfig);
        Map<String, Object> head = reader.readHead(HashMap.class);
        Assert.assertEquals(new Integer(300), (Integer) head.get("totalCount"));
        Assert.assertEquals(new BigDecimal("900.26"), (BigDecimal) head.get("totalAmount"));
        Map<String, Object> row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_0", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_1", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_2", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_3", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_10", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertEquals("seq_11", row.get("seq"));
        row = reader.readRow(HashMap.class);
        Assert.assertNull(row);
        Map<String, Object> tail = reader.readTail(HashMap.class);
        Assert.assertEquals("OFDCFEND", tail.get("fileEnd"));
        Assert.assertEquals("20131109", DateUtil.format((Date) tail.get("date"), "yyyyMMdd"));
        Assert.assertEquals(new BigDecimal("323"), tail.get("amount"));
Clone this wiki locally