文章列表

  • 一、读混合记录文件
    • 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)混合文件讲解相关推荐

  1. 全网最详细SpringBatch读(Reader)跨多行文件讲解

    文章列表 读记录跨多行文件 1.读跨多行文件job配置 2.读跨多行文件reader 3.自定义FieldSetMapper 4.读跨多行文件processor 5.读跨多行文件writer 写在前面 ...

  2. 全网最详细SpringBatch批处理读取分区(Paratition)文件讲解

    文章目录 一.分区Step 1.数据分区 2.分区处理 二.实现分区关键接口 1.Partitioner 2.StepExecutionSplitter 3.PartitionHandler 三.基本 ...

  3. C语言全网最详细的分支和循环语句讲解

    文章目录 前言 一.什么是语句? 二.分支语句(选择结构) 1.if语句 1.1 悬空else 1.2 if书写形式的对比 1.3 小小练习巩固一下 2.switch语句 2.1 在switch语句中 ...

  4. java实现txt文件/文本转语音(全网最详细易懂)

    java实现txt文件/文本转语音(全网最详细易懂) 1.下载依赖包 https://github.com/freemansoft/jacob-project/releases 2.将ddl文件放到j ...

  5. SpringBatch读文件(FlatFileItemReader)写据库(MyBatisBatchItemWriter)(四)

    文章目录 一.抽取顺序读取数据库公共Writer 二.mapper配置文件 三.写数据库的job 四.继承公共CommonProcesor 五.执行job 前言:我们在日常开发中可能会遇到写数据库,S ...

  6. 全网最详细C/C++文件读写总结

    1.linux系统函数文件读写 open函数: int open(const char * pathname, int flags); int open(const char * pathname, ...

  7. “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作

    "是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...

  8. SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)

    文章目录 一.抽取顺序读取多文件公共reader 二.抽取写文件公共基于MultiResourceItemWriter 三.实现自己的ResourceSuffixCreator 四.读取多文件job ...

  9. 超详细的实现上传文件功能教程,文件上传实现。

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 本文更新不及时,请到原文地址浏览:<超详细的实现上传文件功能教程,文件上传实现.>. 一.文件上 ...

最新文章

  1. C语言 求出平面直角坐标系中两点的距离
  2. php长脚本,长PHP脚本运行多次
  3. java程序 扑克牌概率_java – 最简单的扑克牌评估算法
  4. UE4 Packaging and Cooking Games
  5. 学英语(3)---常用语英语
  6. c# 正则表代式的分组和批评模式 .
  7. [转]很经典的http协议详解
  8. DSA——直接插入排序笔记
  9. JavaScript:判断当前浏览器是否为微信浏览器
  10. python程序设计实训报告-Python编程实践(1)
  11. python3.5安装包_Python 3.5.4详细图文安装教程(附安装包) | 我爱分享网
  12. 如何更改node.js的控制台字体颜色?
  13. Power Query 系列 (05) - M 语言介绍
  14. 如何在Excel/Word中使用复选框
  15. 数据库系统概论-数据库系统阶段的特点
  16. 【新书推荐】【2019.06】大局观从何而来
  17. pycharm print 显示红色下划线
  18. C#编写的winform程序绑定comboBox成功,添加一个默认的文字选项请选择
  19. 【电脑使用】如何将电脑磁盘变为移动磁盘?
  20. matlab中size函数使用

热门文章

  1. 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?
  2. 系统架构师笔记(2)
  3. python3精要(20)-函数(1)
  4. 【Python】详解Pandas与Lambda结合进行高效数据分析
  5. 【论文解读】基于图卷积的价格感知推荐
  6. 快乐学习Pandas!开源教程《Joyful-Pandas》发布
  7. AI基础:提供pdf打包下载了!(更新了25集)
  8. 异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结
  9. CVPR2020 | 参数量减半,北大开源全新高效空域转换模块,还原图像逼真细节
  10. 图像分类:常用分类网络结构(附论文下载)