springbatch操作CSV文件
一、需求分析
使用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文件的更多相关文章
- 用javacsv API 来操作csv文件
javacsv是国外开发的一个比较好的操作csv文件的API,这里简单讲一下用法. 先下载javacsv2.0.zip的文件,解压后,把javacsv.jar 添加到项目中. 本站下载地址: htt ...
- C#操作.csv文件Demo
1.使用OleDB操作.csv文件,比较费时 public static DataTable GetDataTableFromCsv(string path,bool isFirstRowHeader ...
- java操作csv文件之javacsv.jar应用
csv文件是分隔文件,如果使用java的io流来写,比较麻烦,这里为大家提供一个javacsv的jar包,这个很方便操作csv文件. 下载地址:https://pan.baidu.com/s/1i46 ...
- java 操作 csv文件
CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...
- python中操作csv文件
python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...
- Python操作csv文件
1.什么是csv文件 The so-called CSV (Comma Separated Values) format is the most common import and export fo ...
- 数学建模之Python操作csv文件
1.用Python通过csv文件里面的某一列,形成键值,然后统计键在其他列出现的次数. import pandas as pd import numpy as np import csv import ...
- Python之Pandas操作csv文件dataframe
# -*- coding: utf-8 -*- # author:baoshan import pandas as pd def main(): aqi_data = pd.read_csv('chi ...
- Java操作csv文件
以前就一直很想搞懂一个问题就是java如何读取和写入csv文件,现在要花时间总结一波. 主要使用的javaCSV.jar javaCSV API:http://javacsv.sourceforge. ...
随机推荐
- Nio学习4——EchoServer在IO,NIO,NIO.2中的实现
堵塞IO实现: public class PlainEchoServer { public void serve(int port) throws IOException { final Server ...
- Nginx + IIS 配置,实现负载均衡
当你的Web应用程序访问量大的时候,一台服务器可能会因为压力过大而无法处理所有的请求.此时,可以增加服务器,采用负载均衡来分担所有的请求.关于Nginx的作用,自行百度了解.总之,在Windows平台 ...
- 使用CASE表达式替代SQL Server中的动态SQL
原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...
- A*寻路算法lua实现
前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...
- Cocos2d:使用 CCCamera 做滚动效果 (Four Ways of Scrolling with Cocos2D)
原版的:http://www.koboldtouch.com/display/IDCAR/Four+Ways+of+Scrolling+with+Cocos2D There are two class ...
- 基于docker构建jenkins和svn服务(转)
码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...
- adp设备是什么
今天在写软工文档的可行性分析部分的时候.遇到一个新名词--adp,瞬间就不淡定了.原话例如以下: 6.1.1 基本建设投资 包含採购.开发和安装下列各项所需的费用,如: a. 须要提供一件教室,供开发 ...
- hdu3836联通的强还原性点
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- android 电平信号状态识别View平局
1.前言 级信号状态View在今天的Android系统是常见.状态的图标就很的经典,有几种状态,到了快没电的时候有些还会闪烁提示用户充电:还有的就是一些地图App的GPS信号强度的提示.Wifi信号强 ...
- AngularJS 实现按需异步加载
习惯了 seajs 的异步加载方式,也想着 angular 也能同样使用异步加载,但是事实不随人愿. angularjs 和 requirejs 一样,使用的是预先加载的方式组织模块(这和 seajs ...