`
feir8510
  • 浏览: 3940 次
社区版块
存档分类
最新评论

Spring-batch使用PatternMatchingCompositeLineTokenizer解析不规则数据文件

阅读更多



     大家都知道,传统Spring-batch能够很好的处理批量任务,其中,提供的trunk组件(batch:trunk)能够处理行文本或者数据库的普通读写操作。下面这个例子可以读写基本的规范数据文件:

     

<batch:step id="analyseInfo">
       <batch:tasklet transaction-manager="transactionManager">
       <batch:chunk reader="wxReader" writer="wxWriter" commit-interval="10"></batch:chunk>
       </batch:tasklet>
</batch:step>
<!-- wx Detail -->
    <bean id="wxReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    	<property name="resource" value="file:#{jobParameters['filename']}"></property>
        <property name="encoding" value="UTF-8"></property>
    	<property name="comments" value="#{'#'}"></property>
    	<property name="lineMapper" ref="wxMapper"></property>    
    	<property name="linesToSkip" value="1"></property>	    
    </bean>
    <bean id="wxWriter" class="com.secondgame.demo_service.demo.batch.task.WxWriter" scope="step">

上述代码中,wxReader负责解析源文件:

resource配置源文件的地址,

encoding配置文件的编码方式,

comments配置注释行的开头,可以跳过注释行,本文例子跳过以#开头的注释行,不进行处理

lineMapper负责具体的处理文件的类,后文会介绍

lineToSkip用来指定跳过处理文本的头N行,本例跳过1行

 

 

lineMapper的配置

 

  <bean id="wxMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
    	<property name="lineTokenizer" ref="wxMultiTokenizer"></property>
    	<property name="fieldSetMapper">
    		<bean class="com.secondgame.demo_service.demo.batch.task.WxFileSetMapper">
    		</bean>
    	</property>
    </bean>
<bean id="wxTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" scope="step">
     	<property name="delimiter" value=","></property>
    	<property name="names">
	   		<list>
	   			<value>tradeTime</value>
	   			<value>pubAccountId</value>
	   			<value>merchantId</value>
	   			<value>subMerchantId</value>
	   			<value>deviceId</value>
	   			<value>wxOrderId</value>
	   			<value>merchantOrderId</value>
	   			<value>userTag</value>
	   			<value>tradeType</value>
	   			<value>tradeStatus</value>
	   			<value>payerBank</value>
	   			<value>capitalType</value>
	   			<value>totalAmount</value>
	   			<value>enterpriseRedAmount</value>
	   			<value>wxRefundId</value>
	   			<value>merchantRefundId</value>
	   			<value>refundAmount</value>
	   			<value>enterpriseRedRefundAmount</value>
	   			<value>refundType</value>
	   			<value>refundStatus</value>
	   			<value>goodsName</value>
	   			<value>merchantData</value>
	   			<value>fee</value>
	   			<value>feeRate</value>
	   		</list>
    	</property>
    </bean>

 

该配置中,使用org.springframework.batch.item.file.transform.DelimitedLineTokenizer进行文件解析,能够将解析出来的每一行利用类com.secondgame.demo_service.demo.batch.task.WxFileSetMapper进行处理。

实际应用中,数据源没有想象的那么“整齐”,可以通过离线数据清洗(各种脚本)的方式将数据进行预处理。但对于基本整齐的文件,可以采用spring-batch提供的行解析器org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer进行处理。该解析器不受限于一种解析器,可以根据通配符配置,对不同的行进行不同的解析,假设文本文件有如下结构:

 

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
1,2,3,4,5
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

该文件每行数据由逗号分隔,但是存在不规则的行(或者有特殊意义,作者遇到的情况是,对账明细单最后有汇总项,而且无法通过前缀区分)。该文本在上述代码配置中,会直接在解析第三行的地方报错:需要24个参数,实际只有5个。

笔者想到的解决方案有如下几种:

1. 与处理文件,把不规则的第三行处理掉

2. 补齐第三行的数据,凑足24个内容。

两者都需要额外的处理数据过程,而使用前文介绍的PatternMatchingCompositeLineTokenizer则可以直接处理该种情况。

 

部分实现的代码如下(仅体现核心思想,直接拷贝代码无法使用,实际工程需要额外配置文件):

<bean id="wxMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
    	<property name="lineTokenizer" ref="wxMultiTokenizer"></property>
    	<property name="fieldSetMapper">
    		<bean class="com.secondgame.demo_service.demo.batch.task.WxFileSetMapper">
    		</bean>
    	</property>
    </bean>
    <bean id="wxMultiTokenizer" class="org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer" scope="step">
    	<!-- <property name="delimiter" value=","></property> -->
   		<property name="tokenizers">
   			<map>
   				<entry key="*,*,*,*,*" value-ref="wxTokenizerTail"></entry>
   				<entry key="*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*" value-ref="wxTokenizer"></entry>
   			</map>
   		</property>
   	</bean>
    <bean id="wxTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" scope="step">
     	<property name="delimiter" value=","></property>
    	<property name="names">
	   		<list>
	   			<value>tradeTime</value>
	   			<value>pubAccountId</value>
	   			<value>merchantId</value>
	   			<value>subMerchantId</value>
	   			<value>deviceId</value>
	   			<value>wxOrderId</value>
	   			<value>merchantOrderId</value>
	   			<value>userTag</value>
	   			<value>tradeType</value>
	   			<value>tradeStatus</value>
	   			<value>payerBank</value>
	   			<value>capitalType</value>
	   			<value>totalAmount</value>
	   			<value>enterpriseRedAmount</value>
	   			<value>wxRefundId</value>
	   			<value>merchantRefundId</value>
	   			<value>refundAmount</value>
	   			<value>enterpriseRedRefundAmount</value>
	   			<value>refundType</value>
	   			<value>refundStatus</value>
	   			<value>goodsName</value>
	   			<value>merchantData</value>
	   			<value>fee</value>
	   			<value>feeRate</value>
	   		</list>
    	</property>
    </bean>
    <bean id="wxTokenizerTail" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" scope="step">
     	<property name="delimiter" value=","></property>
     	<property name="names">
	   		<list>
	   			<value>totalCount</value>
	   			<value>totalAmount</value>
	   			<value>refundAmount</value>
	   			<value>enterpriseRedRefundAmount</value>
	   			<value>fee</value>
	   		</list>
    	</property>
    </bean>

上述代码实现了两个行解析器,分别解析24个数据和5个数据的情况,其他情况可以继续增加行解析器即可。

 

如果数据文件情况更加复杂,可以考虑自定义行解析器,实现自定义功能,这个笔者并没有进一步的研究,以后可以再尝试,本文思路来自于stackoverflow:

http://stackoverflow.com/questions/27504722/how-to-custom-spring-batch-delimitedlinetokenizer

不过这个作者的代码通配符部分我实现*全量替代过不去,还需要进一步看源码。

 

 

 

分享到:
评论

相关推荐

    spring-batch同步数据库mysql源码

    《Spring-Batch同步数据库MySQL源码解析》 在IT领域,数据同步是一项至关重要的任务,尤其是在分布式系统中,保持数据库的一致性是确保系统稳定运行的关键。Spring-Batch作为Spring框架的一部分,为批量处理和数据...

    spring-batch-3.0.5.RELEASE-dist.zip

    在"spring-batch-3.0.5.RELEASE-dist.zip"这个压缩包里,包含了Spring Batch框架的核心组件和相关文档,允许开发者快速地集成和配置批处理作业。以下是一些关键的知识点: 1. **核心概念**: - **Job**:Spring ...

    spring-batch.jar

    在给定的`spring-batch-2.1.6.RELEASE`版本中,这是Spring Batch的一个较旧版本。尽管它仍然可用,但可能缺少一些新功能和改进,建议升级到最新稳定版以获得更好的支持和性能优化。 8. **集成** Spring Batch ...

    spring-batch-admin-1.3.0.RELEASE

    《Spring Batch Admin 1.3.0.RELEASE:全面解析与应用指南》 Spring Batch Admin是基于Spring Batch的管理界面,它为批处理作业的监控、管理和调度提供了一个直观的Web界面。在本文中,我们将深入探讨Spring Batch ...

    Spring-batch Demo.zip

    Spring Batch 是一个强大的、全面的批处理框架,用于处理大量数据。它被设计为高度可扩展和可配置,适用于各种企业级应用。Spring Batch 提供了处理大批量数据时所需的基础设施,包括读取、处理和写入数据,以及错误...

    spring-batch分区处理示例

    Spring Batch 是一个强大的Java框架,专门用于处理批量数据处理任务。在Spring Batch中,分区处理是一种优化策略,它将大型工作负载分解成多个较小、独立的任务,这些任务可以在不同的线程或甚至不同的节点上并行...

    spring-batch-2.2.0.RELEASE-no-dependencies

    《Spring Batch 2.2.0.RELEASE:批量处理与数据转换的核心技术解析》 Spring Batch 是一个由 Spring 社区开发的开源框架,专为处理大批量数据而设计。在2.2.0.RELEASE版本中,它提供了一套强大、可扩展且企业级的...

    spring-batch包

    在压缩包文件 `spring-batch-4.0.0.M5` 中,包含了 Spring Batch 4.0.0 版本的预发布版本。这个版本可能包含了一些实验性的特性和改进,用于测试和反馈,以便在正式版中进行完善。 总的来说,Spring Batch 4.0.0 为...

    spring-batch-excel

    "spring-batch-excel"可能包括了最佳实践,如使用内存优化策略,避免一次性加载整个文件,或者使用多线程处理数据以提高效率。 9. **测试与调试** 高质量的批处理应用需要详尽的测试。项目中可能包含单元测试和...

    spring-batch

    Spring-Batch 是一个开源框架,专门用于处理批量处理任务,...通过阅读提供的《spring-batch-docs.pdf》文档,可以深入了解Spring-Batch 1.0的用法和最佳实践,这对于理解和掌握Spring-Batch的后续版本也有很大的帮助。

    spring-batch+quartz处理mysql数据示例

    在本示例中,MySQL 作为数据源和数据目标,Spring Batch 使用JDBC连接来读取和写入数据。使用MySQL的好处包括高性能、稳定性以及丰富的社区支持。 **集成Spring Batch和Quartz** 将Spring Batch与Quartz结合,可以...

    bank-spring-batch:具有多处理器的Spring Batch项目

    "bank-spring-batch"项目利用Spring Batch框架,设计了一个具备多处理器功能的批量处理解决方案,能够高效地处理银行相关的批量数据任务。通过对ItemReader、ItemProcessor和ItemWriter的灵活配置,以及对Job和Step...

    spring-batch 3.0.7

    这是一个java工程的demo,spring-batch 3.0.7所需的jar都在其中,需要自己建数据库,将两个sql文件运行(此步骤是必须的),然后直接run App.java即可。控制台会显示completed done,数据库的表中会有记录。

    Spring-batch简介.pdf

    SpringBatch主要关注批处理任务的事务、并发、监控和执行等,它本身不提供调度功能,如果需要实现任务的定期执行,可以与其他调度框架如Quartz结合使用。SpringBatch具有轻量级、稳健、并行处理的特点,并支持统一的...

    spring-batch-reference.pdf

    SpringBatch的核心理念是提供一个可扩展的架构,支持处理大量数据时的性能和复杂性,无论数据来自何种数据源。 SpringBatch框架包括多种组件,可以处理各种批处理场景,例如数据迁移、定时任务执行和大规模数据导入...

    spring-batch-reference.rar_SpringBatch英文读物pdf_batch

    这份名为“spring-batch-reference.pdf”的英文文档是Spring Batch的官方参考指南,对于深入理解该框架及其功能至关重要。 Spring Batch 提供了全面的批处理功能,包括事务管理、错误处理、作业调度和监控等。以下...

    spring-boot-cli下载

    2. `spring batch`:提供批处理操作的支持,简化处理大量数据的任务。 3. `spring help`:提供关于所有可用命令的帮助信息。 4. `spring config`:用于处理配置属性,如读取和解析YAML或Properties文件。 在`spring...

    spring-batch-reference

    《Spring Batch参考指南》是Spring框架的一个重要组成部分,专注于批量处理和大数据量操作。Spring Batch为开发者提供了一套全面的框架,用于构建可扩展、高效且健壮的批处理应用程序。下面将详细介绍Spring Batch的...

    spring-batch-admin-ui:Spring Batch管理员是一个最初采用spring boot 2,spring security,oauth2,Spring data jpa作为基础框架,集成了quartz提供调度能力,集成了Spring Batch提供批处理能力的管理系统。展示以及常见批处理的配置以及运行能力

    初始化数据库:找到目录:/ spring-batch-admin-backend / src / main / db,里面有两个文件,一个是数据库创建脚本,一个是表结构+数据的脚本,先执行创建库的,如果想在已经存在的库里面运行程序,可以省略这一步...

    spring-5.2.9.RELEASE-dist.zip(spring-framework-5.2.9.RELEASE)

    《Spring Framework 5.2.9.RELEASE:深入解析与应用》 Spring Framework作为Java开发中的核心框架,自诞生以来就以其强大的功能和灵活的设计深受开发者喜爱。5.2.9.RELEASE是Spring Framework的一个稳定版本,它...

Global site tag (gtag.js) - Google Analytics