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文件,布布扣,bubuko.com

时间: 2024-10-11 04:29:03

springbatch操作CSV文件的相关文章

springbatch操作XML文件

一.需求分析 使用Spring Batch对XML文件进行读写操作: 从一个xml文件中读取商品信息, 经过简单的处理, 写入另外一个xml文件中. 二.代码实现 1. 代码结构图: 2. applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

C#操作CSV文件类实例

本文实例讲述了C#操作CSV文件类.分享给大家供大家参考.具体分析如下: 这个C#类用于转换DataTable为CSV文件.CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适. using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class

python3.x操作csv文件的实战

说明 python3.x集成了对csv文件的操作,直接引入包即可,但python2.x则需要单独安装. 实战 1.读取csv文件 #引入包 import csv #打开文件 csvfile = open('xiaoqiang.csv',newline='') #获得对象 csvReader = csv.reader(csvfile) #读取内容并打印 for content in csvReader:   print(content)    #关闭.这个经常有小伙伴忘了,今天在群里就有人遇到这个

php操作csv文件导入mysql时中文乱码的解决办法

用网上通用的方法读取并上传csv文件内容进入mysql数据库中时,中文显示乱码,即使对数据用iconv函数转码后仍然乱码,这时可以用setlocale()函数: 这个函数经查阅是配置地域信息用的,在读取和写入csv数据前先用此函数进行定义,比如我的csv文件是无BOM的UTF-8格式,就先用如下函数进行定义: setlocale(LC_ALL, 'zh_CN.UTF8′); 然后再用iconv函数对数据内容进行转码入库等后续操作.

【转】Java操作CSV文件导入导出

特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/ 1 public class CSVUtils { 2 3 /** 4 * 5 * 描述:导出 6 * @author [email protected] 7 * @created 2017年8月26日 下午2:39:13 8 * @since 9 * @param file cs

文件操作 CSV文件转换

/// <summary> /// CSV文件转换类 /// </summary> public static class CsvHelper { /// <summary> /// 导出报表为Csv /// </summary> /// <param name="dt">DataTable</param> /// <param name="strFilePath">物理路径<

Python操作csv文件

一.Python读取csv文件 1 说明:以Python3.x为例 2 #读取csv文件方法1 3 import csv 4 csvfile = open('csvWrite.csv',newline='')#打开一个文件 5 csvReader = csv.reader(csvfile)#返回的可迭代类型 6 print(type(csvReader)) 7 for content in csvReader: 8 print(content) 9 csvfile.close()#关闭文件运行结

python对csv文件的读写操作

python内置了csv模块,用它可以方便的操作csv文件. 1.写文件 (1)写文件的方法一 import csv # open 打开文件有多种模式,下面是常见的4种 # r:读数据,默认模式 # w:写数据,如果已有数据则会先清空 # a:向文件末尾追加数据 # x : 写数据,如果文件已存在则失败 # 第2至4种模式如果第一个参数指定的文件不存在,则会先创建一个空文件 with open('1.csv', 'w', newline='') as f: head = ['标题列1', '标题

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

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