欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > javascript >内容正文

javascript

全网最详细springbatch读(reader)跨多行文件讲解 -凯发k8官方网

发布时间:2025/1/21 javascript 18 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 全网最详细springbatch读(reader)跨多行文件讲解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章列表

      • 读记录跨多行文件
        • 1、读跨多行文件job配置
        • 2、读跨多行文件reader
        • 3、自定义fieldsetmapper
        • 4、读跨多行文件processor
        • 5、读跨多行文件writer

写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 java感兴趣,可以关注我,我们一起学习。

前言:在工作中可能会遇到springbatch读取的文件记录跨多行或者文件中存在多种不同的记录格式,不必担心springbatch已经帮我们把接口都预留好了,只需要稍微改造就可以轻松实现。

读记录跨多行文件

当flat文件格式非标准是,通过实现记录分隔策略接口recordseparatorpolicy来实现非标准flat格式文件。非标准flat文件有多种情况,例如记录跨多行、以特定的字符开头、以特定的字符结尾。

下面讲的例子是每两行表示一条记录:

412222,201,tom,2020-02-27 ,china 412453,203,tqm,2020-03-27 ,us 412222,205,tym,2020-05-27 ,jap

默认的记录分割策略simplerecordseparatorpolicy或者defaultrecordseparatorpolicy已经不能处理此类文件。我们可以实现接口recordseparatorpolicy来自定义分割策略mulitilinerecordseparatorpolicy

读记录跨多行文件时,使用到的核心组件类图如下:

在本类图中除了mulitilinerecordseparatorpolicy和commonfieldsetmapper是自定义实现的,其他组件都是springbatch自带。

mulitilinerecordseparatorpolicy:负责从文件中确认一条完整记录,在本实现中每读到四个逗号分隔符,则认为是一条完整的记录

/*** @author shuliangzhao* @date 2020/12/6 13:05*/ public class mulitilinerecordseparatorpolicy implements recordseparatorpolicy {private string delimiter = ",";private int count = 0;public int getcount() {return count;}public void setcount(int count) {this.count = count;}public string getdelimiter() {return delimiter;}public void setdelimiter(string delimiter) {this.delimiter = delimiter;}@overridepublic boolean isendofrecord(string record) {return countdelimiter(record) == count;}private int countdelimiter(string record) {string temp = record;int index = -1;int count = 0;while ((index=temp.indexof(",")) != -1) {temp = temp.substring(index 1);count;}return count;}@overridepublic string postprocess(string record) {return record;}@overridepublic string preprocess(string record) {return record;} }

delimiter :定义为读的的分割符号
count:分隔符总数,给定的字符串包含的分隔符个数等于此值,则认为是一条完整的记录。

1、读跨多行文件job配置

读跨多行文件job基于javabean配置如下

/*** 读记录跨多行文件* @author shuliangzhao* @date 2020/12/6 13:38*/ @configuration @enablebatchprocessing public class mulitilineconfiguration {@autowiredprivate jobbuilderfactory jobbuilderfactory;@autowiredprivate stepbuilderfactory stepbuilderfactory;@autowiredprivate partitonmultifileprocessor partitonmultifileprocessor;@autowiredprivate partitionmultifilewriter partitionmultifilewriter;@beanpublic job mulitilinejob() {return jobbuilderfactory.get("mulitilinejob").start(mulitilinestep()).build();}@beanpublic step mulitilinestep() {return stepbuilderfactory.get("mulitilinestep").<creditbill,creditbill>chunk(12).reader(mulitilinerecordreader()).processor(partitonmultifileprocessor).writer(partitionmultifilewriter).build();}@bean@stepscopepublic mulitilinerecordreader mulitilinerecordreader() {return new mulitilinerecordreader(creditbill.class);} }

2、读跨多行文件reader

mulitilinerecordreader详细如下

/*** @author shuliangzhao* @date 2020/12/6 13:09*/ public class mulitilinerecordreader extends flatfileitemreader {public mulitilinerecordreader(class clz) {setresource(commonutil.createresource("d:\\aplus\\muliti\\muliti.csv"));string[] names = commonutil.names(clz);defaultlinemapper defaultlinemapper = new defaultlinemapper();commonfieldsetmapper commonfieldsetmapper = new commonfieldsetmapper();commonfieldsetmapper.settargettype(clz);defaultlinemapper.setfieldsetmapper(commonfieldsetmapper);delimitedlinetokenizer delimitedlinetokenizer = new delimitedlinetokenizer();delimitedlinetokenizer.setfieldsetfactory(new defaultfieldsetfactory());delimitedlinetokenizer.setnames(names);delimitedlinetokenizer.setdelimiter(",");defaultlinemapper.setlinetokenizer(delimitedlinetokenizer);mulitilinerecordseparatorpolicy mulitilinerecordseparatorpolicy = new mulitilinerecordseparatorpolicy();mulitilinerecordseparatorpolicy.setcount(4);mulitilinerecordseparatorpolicy.setdelimiter(",");setrecordseparatorpolicy(mulitilinerecordseparatorpolicy);setlinemapper(defaultlinemapper);} }

3、自定义fieldsetmapper

自定义commonfieldsetmapper

*** @author shuliangzhao* @date 2020/12/4 22:14*/ public class commonfieldsetmapper<t> implements fieldsetmapper<t> {private class<? extends t> type;@overridepublic t mapfieldset(fieldset fieldset) throws bindexception {try {t t = type.newinstance();field[] declaredfields = type.getdeclaredfields();if (declaredfields != null) {for (field field : declaredfields) {field.setaccessible(true);if (field.getname().equals("id")) {continue;}string name = field.gettype().getname();if (name.equals("java.lang.integer")) {field.set(t,fieldset.readint(field.getname()));}else if (name.equals("java.lang.string")) {field.set(t,fieldset.readstring(field.getname()));}else if (name.equals("java.util.date")) {field.set(t,fieldset.readdate(field.getname()));}else{field.set(t,fieldset.readstring(field.getname()));}}return t;}} catch (exception e) {e.printstacktrace();}return null;}public void settargettype(class<? extends t> type) {this.type = type;}

4、读跨多行文件processor

partitonmultifileprocessor 详细如下

@component @stepscope public class partitonmultifileprocessor implements itemprocessor<creditbill,creditbill> {@overridepublic creditbill process(creditbill item) throws exception {creditbill creditbill = new creditbill();creditbill.setacctid(item.getacctid());creditbill.setaddress(item.getaddress());creditbill.setamout(item.getamout());creditbill.setdate(item.getdate());creditbill.setname(item.getname());return creditbill;} }

5、读跨多行文件writer

partitionmultifilewriter详细如下

@component @stepscope public class partitionmultifilewriter implements itemwriter<creditbill> {@autowiredprivate creditbillmapper creditbillmapper;@overridepublic void write(list<? extends creditbill> items) throws exception {if (items != null && items.size() > 0) {items.stream().foreach(item -> {creditbillmapper.insert(item);});}} }

至此,我们完成了对跨行读文件的处理。
如果想更详细查看以上所有代码请移步到github:读跨多行文件详细代码

总结

以上是凯发k8官方网为你收集整理的全网最详细springbatch读(reader)跨多行文件讲解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图