一、需求分析

使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score),

对文件做简单的处理, 然后输出到还有一个csv文件里.

二、代码实现

1. 代码结构图:

JobLaunch: 启动Job

CsvItemProcessor: 对Reader数据进行处理

Student: 实体对象

input.csv: 数据读取文件

output.csv: 数据输出文件

2. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-autowire="byName"> <context:annotation-config />
<context:component-scan base-package="com.zdp.springbatch" /> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans>

3. springBatch.xml

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"
xmlns:bean="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd"> <!-- 装载spring核心配置文件 -->
<bean:import resource="applicationContext.xml" /> <bean:bean id="student" class="com.zdp.springbatch.Student"></bean:bean> <job id="csvJob">
<step id="csvStep">
<tasklet transaction-manager="transactionManager">
<chunk reader="csvItemReader" writer="csvItemWriter" processor="csvItemProcessor" commit-interval="1" />
</tasklet>
</step>
</job> <!-- 读csv文件 -->
<bean:bean id="csvItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<bean:property name="resource" value="classpath:input.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> <!-- 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> <!-- 写CSV文件 -->
<bean:bean id="csvItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<bean:property name="resource" value="file:src/output.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>
</bean:beans>

这个文件中配置了这次执行的JOB:csvJob。本Job包括一个Step。完毕一个完整的CSV文件读写功能。

分别由 csvItemReader完毕CSV文件的读操作,由 csvItemProcessor完毕对取得数据的处理,由 csvItemWriter完毕对CSV文件的写操作

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。

csvItemWriter实现的是FlatFileItemWriter类。此类与FlatFileItemReader类相似,也有两个重要的属性:resource和lineAggregator。

前者是要输出的文件的路径,后者和lineTokenizer类似。lineAggregator(本实例用DelimitedLineAggregator类)也有两个重要的属性:delimiter和fieldExtractor。

Delimiter标示输出的字段以什么切割,后者将Pojo对象组装成由Pojo对象的字段组成的一个字符串。

相同FlatFileItemWriter写一条记录也有下面四步完毕:1,Processor传递过来一个对象给lineAggregator;2。lineAggregator将其这个对象转化成一个数组;3,再由lineAggregator的属性fieldExtractor将数组转化成依照delimiter切割一个字符串。4,将这个字符串输出。

4. CsvItemProcessor

/**
* ItemProcessor类。
*/
@Component("csvItemProcessor")
public class CsvItemProcessor implements ItemProcessor<Student, Student> { /**
* 对取到的数据进行简单的处理。 *
* @param student 处理前的数据。
* @return 处理后的数据。
* @exception Exception 处理是发生的不论什么异常。 */
@Override
public Student process(Student student) throws Exception {
// 合并id和name
student.setName(student.getId() + "--" + student.getName());
// age加2
student.setAge(student.getAge() + 2);
// score加10
student.setScore(student.getScore() + 10);
// 将处理后的结果传递给writer
return student;
}

csvItemProcessor实现的是ItemProcessor类。此类接受Reader映射成的Pojo对象。能够对此对象做对应的业务逻辑处理,然后返回,框架就会将返回的结果传递给Writer进行写操作

5. Student

/**
* Pojo类_Student
*/
public class Student {
private String id;
private String name;
private int age;
private float score; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public float getScore() {
return score;
} public void setScore(float score) {
this.score = score;
}
}

6. JobLaunch

/**
* Test client
*/
public class JobLaunch { public static void main(String[] args) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("springBatch.xml"); JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("csvJob"); // JobLauncher能够用来启动Job
JobExecution result = jobLauncher.run(job, new JobParameters()); // 处理结束,控制台打印处理结果
System.out.println(result.toString());
} catch (Exception e) {
throw new RuntimeException("error happens...", e);
}
}
}

7. input and output

input.csv:

output.csv:

转自:http://www.cnblogs.com/gulvzhe

版权声明:本文博客原创文章,博客,未经同意,不得转载。

springbatch操作CSV文件的更多相关文章

  1. 用javacsv API 来操作csv文件

    javacsv是国外开发的一个比较好的操作csv文件的API,这里简单讲一下用法. 先下载javacsv2.0.zip的文件,解压后,把javacsv.jar 添加到项目中.  本站下载地址: htt ...

  2. C#操作.csv文件Demo

    1.使用OleDB操作.csv文件,比较费时 public static DataTable GetDataTableFromCsv(string path,bool isFirstRowHeader ...

  3. java操作csv文件之javacsv.jar应用

    csv文件是分隔文件,如果使用java的io流来写,比较麻烦,这里为大家提供一个javacsv的jar包,这个很方便操作csv文件. 下载地址:https://pan.baidu.com/s/1i46 ...

  4. java 操作 csv文件

    CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...

  5. python中操作csv文件

    python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...

  6. Python操作csv文件

    1.什么是csv文件 The so-called CSV (Comma Separated Values) format is the most common import and export fo ...

  7. 数学建模之Python操作csv文件

    1.用Python通过csv文件里面的某一列,形成键值,然后统计键在其他列出现的次数. import pandas as pd import numpy as np import csv import ...

  8. Python之Pandas操作csv文件dataframe

    # -*- coding: utf-8 -*- # author:baoshan import pandas as pd def main(): aqi_data = pd.read_csv('chi ...

  9. Java操作csv文件

    以前就一直很想搞懂一个问题就是java如何读取和写入csv文件,现在要花时间总结一波. 主要使用的javaCSV.jar javaCSV API:http://javacsv.sourceforge. ...

随机推荐

  1. 第十二章——SQLServer统计信息(1)——创建和更新统计信息

    原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索 ...

  2. inner join on, left join on, right join on

    1.定义: inner join(等值连接) : 仅仅返回两个表中联结字段相等的记录 left join(左联接) :返回包含左表中的全部记录和右表中联结字段相等的记录 right join(右联接) ...

  3. WEB功能测试说明

    站点功能測试就是对产品的各功能进行验证.依据功能測试用例,逐项測试.检查产品是否达到用户 要求的功能.经常使用的測试方法例如以下: 1.页面链接检查: 每个链接是否都有相应的页面.而且页面之间切换工具 ...

  4. 颜色(color)转换为三刺激值(r/g/b)(干股)

    //颜色转换  ##665522 - 三色值 + (UIColor *)setFontColorWithString:(NSString *)color {     NSString *cString ...

  5. IT该忍者神龟Jquery小工具easyUI物业摘要召回

    找了个时间看了下EasyUI插件.对它的插件感觉是非常舒服,特地把Easy UI的大部分功能属性做了一下汇总. 此属性列表请对比jQuery EasyUI 1.0.5,关于它的很多其它资讯请猛击这里. ...

  6. ACM-DP最大连续子——hdu1231

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  7. vim cheat sheet

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE1Mjg5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. HDU 4916 Count on the path

    意甲冠军: 考虑到一棵树,m询价  不要求回答每一次询价u和v通过在两个节点形成的最低等级点路径 思路: 一開始以为是LCA-  只是T了好几次-  后来发现不用LCA也可做 考虑每一个询问u和v   ...

  9. log4j与commons-logging,slf4j的关系(转)

    前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...

  10. mariadb 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    [root@localhost /]# systemctl stop mariadb.service[root@localhost /]# mysqld_safe --user=mysql --ski ...