Spring Batch 简单应用(CSV文件操作)(二)

本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对CSV文件的读写操作。此实例的流程是:读取一个含有四个字段的CSV文件(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个CSV文件中。

工程结构如下图:

JobLaunch类用来启动Job, CsvItemProcessor类用来对Reader取得的数据进行处理, Student类是一个POJO类,用来存放映射的数据。 inputFile.csv是数据读取文件, outputFile.csv是数据输出文件。

application.xml文件配置如前篇文章,不再赘述。

batch.xml文件中Job配置如下:

<job id="csvJob">        <step id="csvStep">            <tasklet transaction-manager="transactionManager">                <chunk reader="csvItemReader" writer="csvItemWriter" processor="csvItemProcessor" commit-interval="1">                </chunk>            </tasklet>        </step>    </job>

这个文件里配置了这次运行的JOB:csvJob。本Job包含一个Step,完成一个完整的CSV文件读写功能。分别由 csvItemReader完成CSV文件的读操作,由 csvItemProcessor完成对取得数据的处理,由 csvItemWriter完成对CSV文件的写操作。

batch.xml文件中csvItemReader配置如下:

<!-- 读取csv文件 -->    <bean:bean id="csvItemReader"        class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">        <bean:property name="resource" value="classpath:inputFile.csv"/>        <bean:property name="lineMapper">            <bean:bean                class="org.springframework.batch.item.file.mapping.DefaultLineMapper">                <bean:property name="lineTokenizer" ref="lineTokenizer"/>                <bean:property name="fieldSetMapper">                    <bean:bean                        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">                        <bean:property name="prototypeBeanName" value="student"></bean:property>                    </bean:bean>                </bean:property>            </bean:bean>        </bean:property>    </bean:bean>

<bean:bean id="student" class="com.wanggc.springbatch.sample.csv.Student"></bean:bean>

<!-- lineTokenizer -->    <bean:bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">        <bean:property name="delimiter" value=","/>        <bean:property name="names">            <bean:list>                <bean:value>ID</bean:value>                <bean:value>name</bean:value>                <bean:value>age</bean:value>                <bean:value>score</bean:value>            </bean:list>        </bean:property>    </bean:bean>

csvItemReader实现的是Spring Batch提供FlatFileItemReader类,此类主要用于Flat文件的读操作。它包含两个必要的属性 resource和 lineMapper。前者指定要读取的文件的位置,后者是将文件的每一行映射成一个Pojo对象。其中 lineMapper也有两个重要属性 lineTokenizer和 fieldSetMapper, lineTokenizer将文件的一行分解成一个 FieldSet,然后由 fieldSetMapper映射成Pojo对象。

这种方式与DB的读操作非常类似。lineMapper类似于ResultSet,文件中的一行类似于Table中的一条记录,被封装成的FieldSet,类似于RowMapper。至于怎么将一条记录封装,这个工作由lineTokenizer的继承类DelimitedLineTokenizer完成。DelimitedLineTokenizer的delimiter属性决定文件的一行数据按照什么分解,默认的是“,”, names属性标示分解的每个字段的名字,传给fieldSetMapper(本实例用的是BeanWrapperFieldSetMapper)的时候,就可以按照这个名字取得相应的值。fieldSetMapper的属性prototypeBeanName,是映射Pojo类的名字。设置了此属性后,框架就会将lineTokenizer分解成的一个FieldSet映射成Pojo对象,映射是按照名字来完成的(lineTokenizer分解时标注的名字与Pojo对象中字段的名字对应)。

总之,FlatFileItemReader读取一条记录由以下四步完成:1,从resource指定的文件中读取一条记录;2,lineTokenizer将这条记录按照delimiter分解成Fileset,每个字段的名字由names属性取得;3,将分解成的Fileset传递给fieldSetMapper,由其按照名字映射成Pojo对象;4,最终由FlatFileItemReader将映射成的Pojo对象返回,框架将返回的对象传递给Processor。

csvItemProcessor实现的是ItemProcessor类。此类接受Reader映射成的Pojo对象,可以对此对象做相应的业务逻辑处理,然后返回,框架就会将返回的结果传递给Writer进行写操作。具体实现代码如下:

package com.wanggc.springbatch.sample.csv;

import org.springframework.batch.item.ItemProcessor;import org.springframework.stereotype.Component;

/** * ItemProcessor类。 */@Component("csvItemProcessor")public class CsvItemProcessor implements ItemProcessor<Student, Student> {

/**     * 对取到的数据进行简单的处理。     *      * @param student     *            处理前的数据。     * @return 处理后的数据。     * @exception Exception     *                处理是发生的任何异常。     */    @Override    public Student process(Student student) throws Exception {        /* 合并ID和名字 */        student.setName(student.getID() + "--" + student.getName());        /* 年龄加2 */        student.setAge(student.getAge() + 2);        /* 分数加10 */        student.setScore(student.getScore() + 10);        /* 将处理后的结果传递给writer */        return student;    }}

batch.xml文件中csvItemReader配置如下:

<!-- 写CSV文件 -->    <bean:bean id="csvItemWriter"        class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">        <bean:property name="resource" value="file:src/outputFile.csv"/>        <bean:property name="lineAggregator">            <bean:bean                class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">                <bean:property name="delimiter" value=","></bean:property>                <bean:property name="fieldExtractor">                    <bean:bean                        class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">                        <bean:property name="names" value="name,age,score"></bean:property>                    </bean:bean>                </bean:property>            </bean:bean>        </bean:property>    </bean:bean>

csvItemWriter实现的是FlatFileItemWriter类。此类与FlatFileItemReader类相似,也有两个重要的属性:resource和lineAggregator。前者是要输出的文件的路径,后者和lineTokenizer类似。lineAggregator(本实例用DelimitedLineAggregator类)也有两个重要的属性:delimiter和fieldExtractor。Delimiter标示输出的字段以什么分割,后者将Pojo对象组装成由Pojo对象的字段组成的一个字符串。同样FlatFileItemWriter写一条记录也有以下四步完成:1,Processor传递过来一个对象给lineAggregator;2,lineAggregator将其这个对象转化成一个数组;3,再由lineAggregator的属性fieldExtractor将数组转化成按照delimiter分割一个字符串;4,将这个字符串输出。

这样,一条数据的读、处理、写操作就基本完成了。当然,读和写也可以自己写类来处理,只是要注意继承FlatFileItemReader和FlatFileItemWriter就可以了。

实例中用到的Student类代码如下:

package com.wanggc.springbatch.sample.csv;

/** Pojo类_Student */public class Student {    /** ID */    private String ID = "";    /** 名字 */    private String name = "";    /** 年龄 */    private int age = 0;    /** 分数 */    private float score = 0;    /*getter 和setter已删除*/}

时间: 2024-07-30 13:45:16

Spring Batch 简单应用(CSV文件操作)(二)的相关文章

Spring Batch示例: 读取CSV文件并写入MySQL数据库

Spring Batch示例: 读取CSV文件并写入MySQL数据库 GitHub版本: https://github.com/kimmking/SpringBatchReferenceCN/blob/master/01_introduction/Spring_Batch_MySQL.md 原文链接: Reading and writing CVS files with Spring Batch and MySQL 原文作者: Steven Haines - 技术架构师 下载本教程的源代码: S

ObjectiveC 文件操作二

10,文件委托,以便操作文件.头部看起来像是这样. @interface MyFileManager : NSObject @property(strong)NSFileManager *fileManager; @end .m文件 #import "MyFileManager.h" @implementation MyFileManager @synthesize fileManager; @end 可以在头部引入接口. #import <Foundation/Foundati

项目--简单导出CSV文件

//导出 protected void BtnOutPut_Click(object sender, EventArgs e) { //角色 InitialRoles(); DataTable dt = DBClass.GetDataTable(string.Format(@"SELECT * FROM {0} Order By SN desc", View(Where))); StringWriter sw = new StringWriter(); //4S店不能看到总部价格等相关

IOS学习之IOS沙盒(sandbox)机制和文件操作(二)

我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 NSString *homeDirectory = NSHomeDirectory(); NSLog(@"path:%@", homeDirectory); 打印结果: 2012-06-17 14:00:06.098 IosSandbox[3536:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/ Applic

Spring Batch 简单应用 (三)(XML文件操作)

前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作.实例流程是从一个XML文件中读取商品信息,经过简单的处理,写入另外一个XML文件中. 工程结构如下图: log4j.xml是log处理的配置文件,与本文没有必然联系,再此不做论述. application.xml文件内容如下: 按 Ctrl+C 复制代码 <?xml version="1.0"

Spring Batch 简单应用 (一)(Hello World)

通过前面两篇关于Spring Batch文章的介绍,大家应该已经对Spring Batch有个初步的概念了.这篇文章,将通过一个"Hello World!"实例,和大家一起探讨关于Spring Batch的一些基本配置和实现.使大家从开发的角度对Spring Batch有一个真切的体会. 说明:1,本实例使用的是spring-batch 2.1.8 2,本实例没有像前面讲的那样配置ItemReader.ItemProcessor和ItemWriter,而是之间在Step中调用Taskl

使用commons-csv简单读写CSV文件

文章首发于我的github博客 需求 客户的开发测试环境将做迁移.因此需要对zookeeper上的重要的数据以CSV文件格式做备份. 本文通过Apache的commons-csv操作CSV文件.官网地址:http://commons.apache.org/proper/commons-csv/ 基本概念 维基百科对CSV的解释: 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文

20141227文件夹和文件操作二

文件操作 对文件里面的内容进行读写 PHP5文件操作 将文件的内容整个进行读取和写入 读取文件 file_get_contents:从一个指定的文件内读取数据内容. 写入内容 file_put_contents:将指定的字符串写入到对应的文件 注意:file_put_contents如果要写入的文件不存在,系统会自动创建,有的话就直接写入 默认的file_put_contents写入数据的时候,会先清空数据再写入 如果要在文件后面追加内容:应该使用file_put_contents的第三个参数

一个封装好的CSV文件操作C#类代码

using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class CsvHelper { /// <summary> /// 导出报表为Csv /// </summary> /// <param name="dt">DataTable<