全网最详细SpringBatch读(Reader)混合文件讲解
文章列表
- 一、读混合记录文件
- 1、FieldSetMapper实现
- 2、LineTokenizer实现
- 3、混合读reader实现类
- 4、读混合文件job配置
- 5、读混合文件processor
- 6、读混合文件writer
写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习。
前言:在工作中可能会遇到一个文件存在多种不同的记录需要处理,不要慌SpringBatch已经给我们预留好接口处理这类文件。下面让我们来一探究竟把。
一、读混合记录文件
一般情况下读文件中的记录格式是一致的,在特殊情况下一个文件中存在多种不同的记录格式,通过特定的开头可以区分不同的记录。例如下面文件,以41开头代表信用卡消费记录,以31开头代表借记卡消费记录。
SpringBatch框架对文件中存在不同记录格式同样有友好的支持,通过复杂数据转换类PatternMatchingCompositeLineMapper,可以为不同记录定义不同的LineTokenizer和FieldSetMapper进行数据转换。
混合记录读主要类图如下:
PatternMatchingCompositeLineMapper:为不同的记录转变不同的LineTokenizer和FieldSetMapper实现数据转换
1、FieldSetMapper实现
1、CreditBillFieldSetMapper借记卡数据转换类,将3*格式的记录转换为领域对象CreditBill
/*** @author shuliangzhao* @date 2020/12/6 14:22*/
public class CreditBillFieldSetMapper implements FieldSetMapper<CreditAndDebitBill> {@Overridepublic CreditAndDebitBill mapFieldSet(FieldSet fieldSet) throws BindException {CreditAndDebitBill creaditAndDebitBill = new CreditAndDebitBill();CreditBill creditBill = new CreditBill();creditBill.setName(fieldSet.readString("name"));creditBill.setDate(fieldSet.readDate("date"));creditBill.setAmout(fieldSet.readInt("amout"));creditBill.setAddress(fieldSet.readString("address"));creditBill.setAcctid(fieldSet.readString("acctid"));creaditAndDebitBill.setCreditBill(creditBill);return creaditAndDebitBill;}
}
2、DebitBillFieldSetMapper贷记卡数据转换类,将4*格式的记录转换为领域对象DebitBill
/*** @author shuliangzhao* @date 2020/12/6 14:26*/
public class DebitBillFieldSetMapper implements FieldSetMapper<CreditAndDebitBill> {@Overridepublic CreditAndDebitBill mapFieldSet(FieldSet fieldSet) throws BindException {CreditAndDebitBill creditAndDebitBill = new CreditAndDebitBill();DebitBill debitBill = new DebitBill();debitBill.setAcctid(fieldSet.readString("acctid"));debitBill.setAmout(fieldSet.readInt("amout"));debitBill.setDate(fieldSet.readDate("date"));debitBill.setName(fieldSet.readString("name"));creditAndDebitBill.setDebitBill(debitBill);return creditAndDebitBill;}
}
2、LineTokenizer实现
1、CreditBillTokenizer借记卡分隔器处理类
/*** @author shuliangzhao* @date 2020/12/6 14:03*/
public class CreditBillTokenizer extends DelimitedLineTokenizer {@Overridepublic FieldSet tokenize(String line) {return super.tokenize(line);}
}
2、DebitBillTokenizer贷记卡分隔器处理类
/*** @author shuliangzhao* @Title: DebitBillTokenizer* @ProjectName spring-boot-learn* @Description: TODO* @date 2020/12/6 14:06*/
public class DebitBillTokenizer extends DelimitedLineTokenizer {@Overridepublic FieldSet tokenize(String line) {return super.tokenize(line);}
}
3、混合读reader实现类
混合读文件PatternMatchFileReader封装
/*** 读取混合文件reader* @author shuliangzhao* @date 2020/12/6 13:55*/
public class PatternMatchFileReader extends FlatFileItemReader {public PatternMatchFileReader(Class clz,Class clz1) {setResource(CommonUtil.createResource("D:\\aplus\\muliti\\pattern.csv"));PatternMatchingCompositeLineMapper patternMatchingCompositeLineMapper = new PatternMatchingCompositeLineMapper();Map<String, LineTokenizer> map = new HashMap<>();createTokenizer(map,clz,clz1);patternMatchingCompositeLineMapper.setTokenizers(map);Map<String, FieldSetMapper> map1 = new HashMap<>();createFieldSetMapper(map1,clz,clz1);patternMatchingCompositeLineMapper.setFieldSetMappers(map1);setLineMapper(patternMatchingCompositeLineMapper);}private void createFieldSetMapper(Map<String, FieldSetMapper> map1,Class clz,Class clz1) {DebitBillFieldSetMapper debitBillFieldSetMapper = new DebitBillFieldSetMapper();CreditBillFieldSetMapper creditBillFieldSetMapper = new CreditBillFieldSetMapper();map1.put("4*",creditBillFieldSetMapper);map1.put("3*",debitBillFieldSetMapper);}private void createTokenizer(Map<String, LineTokenizer> map,Class clz,Class clz1) {CreditBillTokenizer creditBillTokenizer = new CreditBillTokenizer();creditBillTokenizer.setNames(CommonUtil.names(clz));creditBillTokenizer.setDelimiter(",");DebitBillTokenizer debitBillTokenizer = new DebitBillTokenizer();debitBillTokenizer.setNames(CommonUtil.names(clz1));debitBillTokenizer.setDelimiter(",");map.put("4*",creditBillTokenizer);map.put("3*",debitBillTokenizer);}
}
注意:map存放key为4和3。至于为什么要这样存放请看PatternMatcher这个match方法
4、读混合文件job配置
读混合文件job基于javabean配置如下
/*** @author shuliangzhao* @date 2020/12/6 14:18*/
@Configuration
@EnableBatchProcessing
public class PatternMatchConfigruation {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate PatternMatchProcessor patternMatchProcessor;@Autowiredprivate PatternMatchWriter patternMatchWriter;@Beanpublic Job patternMatchJob() {return jobBuilderFactory.get("patternMatchJob").start(patternMatchStep()).build();}@Beanpublic Step patternMatchStep() {return stepBuilderFactory.get("patternMatchStep").<CreditAndDebitBill,CreditAndDebitBill>chunk(2).reader(patternMatchFileReader()).processor(patternMatchProcessor).writer(patternMatchWriter).build();}@Bean@StepScopepublic PatternMatchFileReader patternMatchFileReader() {return new PatternMatchFileReader(CreditBill.class, DebitBill.class);}
}
5、读混合文件processor
PatternMatchProcessor实现如下:
/*** @author shuliangzhao* @date 2020/12/6 14:32*/
@Component
@StepScope
public class PatternMatchProcessor implements ItemProcessor<CreditAndDebitBill,CreditAndDebitBill> {@Overridepublic CreditAndDebitBill process(CreditAndDebitBill item) throws Exception {CreditAndDebitBill creditAndDebitBill = new CreditAndDebitBill();if (item.getCreditBill() != null) {CreditBill creditBill = new CreditBill();BeanUtils.copyProperties(item.getCreditBill(),creditBill);creditAndDebitBill.setCreditBill(creditBill);}if (item.getDebitBill() != null) {DebitBill debitBill = new DebitBill();BeanUtils.copyProperties(item.getDebitBill(),debitBill);creditAndDebitBill.setDebitBill(debitBill);}return creditAndDebitBill;}
}
6、读混合文件writer
PatternMatchWriter 实现如下:
/*** @author shuliangzhao* @date 2020/12/6 14:35*/
@Component
@StepScope
public class PatternMatchWriter implements ItemWriter<CreditAndDebitBill> {@Autowiredprivate CreditBillMapper creditBillMapper;@Autowiredprivate DebitBillMapper debitBillMapper;@Overridepublic void write(List<? extends CreditAndDebitBill> items) throws Exception {for (CreditAndDebitBill creditAndDebitBill:items) {if (creditAndDebitBill.getDebitBill() != null) {debitBillMapper.insert(creditAndDebitBill.getDebitBill());}if (creditAndDebitBill.getCreditBill() != null) {creditBillMapper.insert(creditAndDebitBill.getCreditBill());}}}
}
至此,我们完成了读混合文件的处理。
如果想更详细查看以上所有代码请移步到github:读混合文件
全网最详细SpringBatch读(Reader)混合文件讲解相关推荐
- 全网最详细SpringBatch读(Reader)跨多行文件讲解
文章列表 读记录跨多行文件 1.读跨多行文件job配置 2.读跨多行文件reader 3.自定义FieldSetMapper 4.读跨多行文件processor 5.读跨多行文件writer 写在前面 ...
- 全网最详细SpringBatch批处理读取分区(Paratition)文件讲解
文章目录 一.分区Step 1.数据分区 2.分区处理 二.实现分区关键接口 1.Partitioner 2.StepExecutionSplitter 3.PartitionHandler 三.基本 ...
- C语言全网最详细的分支和循环语句讲解
文章目录 前言 一.什么是语句? 二.分支语句(选择结构) 1.if语句 1.1 悬空else 1.2 if书写形式的对比 1.3 小小练习巩固一下 2.switch语句 2.1 在switch语句中 ...
- java实现txt文件/文本转语音(全网最详细易懂)
java实现txt文件/文本转语音(全网最详细易懂) 1.下载依赖包 https://github.com/freemansoft/jacob-project/releases 2.将ddl文件放到j ...
- SpringBatch读文件(FlatFileItemReader)写据库(MyBatisBatchItemWriter)(四)
文章目录 一.抽取顺序读取数据库公共Writer 二.mapper配置文件 三.写数据库的job 四.继承公共CommonProcesor 五.执行job 前言:我们在日常开发中可能会遇到写数据库,S ...
- 全网最详细C/C++文件读写总结
1.linux系统函数文件读写 open函数: int open(const char * pathname, int flags); int open(const char * pathname, ...
- “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作
"是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...
- SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)
文章目录 一.抽取顺序读取多文件公共reader 二.抽取写文件公共基于MultiResourceItemWriter 三.实现自己的ResourceSuffixCreator 四.读取多文件job ...
- 超详细的实现上传文件功能教程,文件上传实现。
重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 本文更新不及时,请到原文地址浏览:<超详细的实现上传文件功能教程,文件上传实现.>. 一.文件上 ...
最新文章
- C语言 求出平面直角坐标系中两点的距离
- php长脚本,长PHP脚本运行多次
- java程序 扑克牌概率_java – 最简单的扑克牌评估算法
- UE4 Packaging and Cooking Games
- 学英语(3)---常用语英语
- c# 正则表代式的分组和批评模式 .
- [转]很经典的http协议详解
- DSA——直接插入排序笔记
- JavaScript:判断当前浏览器是否为微信浏览器
- python程序设计实训报告-Python编程实践(1)
- python3.5安装包_Python 3.5.4详细图文安装教程(附安装包) | 我爱分享网
- 如何更改node.js的控制台字体颜色?
- Power Query 系列 (05) - M 语言介绍
- 如何在Excel/Word中使用复选框
- 数据库系统概论-数据库系统阶段的特点
- 【新书推荐】【2019.06】大局观从何而来
- pycharm print 显示红色下划线
- C#编写的winform程序绑定comboBox成功,添加一个默认的文字选项请选择
- 【电脑使用】如何将电脑磁盘变为移动磁盘?
- matlab中size函数使用
热门文章
- 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?
- 系统架构师笔记(2)
- python3精要(20)-函数(1)
- 【Python】详解Pandas与Lambda结合进行高效数据分析
- 【论文解读】基于图卷积的价格感知推荐
- 快乐学习Pandas!开源教程《Joyful-Pandas》发布
- AI基础:提供pdf打包下载了!(更新了25集)
- 异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结
- CVPR2020 | 参数量减半,北大开源全新高效空域转换模块,还原图像逼真细节
- 图像分类:常用分类网络结构(附论文下载)