Java Generate/Merge Files(6)OpenCSV

本文介绍如何使用OpenCSV库在Java中读写CSV文件。通过具体示例展示了如何将Java对象转换为CSV文件及从CSV文件读取数据到Java对象。包括异常处理和资源关闭等细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java Generate/Merge Files(6)OpenCSV

We will use CSV Open source Project called opencsv.

The implementation is as follow:
package com.j2c.feeds2g.services;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import com.j2c.feeds2g.services.base.BaseService;
import com.opencsv.CSVWriter;
import com.opencsv.bean.CsvToBeanBuilder;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;

public class CSVMappingServiceOpenCSVImpl<T> extends BaseService implements CSVMappingService<T> {

@SuppressWarnings("unchecked")
public void toCSV(String fileName, List<T> objects) {
FileWriter fileWriter = null;
try {
logger.debug("generate the CSV file in " + fileName);
fileWriter = new FileWriter(fileName, true); // true means append
StatefulBeanToCsv<T> btcsv = new StatefulBeanToCsvBuilder<T>(fileWriter)
.withQuotechar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.withEscapechar('\\')
.build();
btcsv.write(objects);
fileWriter.flush();
} catch (IOException e) {
logger.error("File IO error ", e);
} catch (CsvDataTypeMismatchException e) {
logger.error("CSV converting error ", e);
} catch (CsvRequiredFieldEmptyException e) {
logger.error("CSV converting error ", e);
} finally{
try {
fileWriter.close();
} catch (IOException e) {
logger.error("close file fail", e);
}
}

}

@SuppressWarnings("unchecked")
public List<T> toJava(String fileName, Class<T> classType) {
FileReader fileReader = null;
List<T> results = null;
try {
fileReader = new FileReader(fileName);
results = new CsvToBeanBuilder<T>(fileReader)
.withType(classType)
.withQuoteChar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.withEscapeChar('\\')
.build().parse();
} catch (FileNotFoundException e) {
logger.error("File IO error ", e);
} finally{
try {
fileReader.close();
} catch (IOException e) {
logger.error("close file fail", e);
}
}
return results;
}

}

I put some annotation in the java bean as follow:
package com.j2c.feeds2g.models;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.opencsv.bean.CsvBindByPosition;

public class Job implements Serializable {

private static final long serialVersionUID = -1913448226704214691L;

@CsvBindByPosition(position = 0)
@JsonProperty("job_id_mapping")
private Long jobIDMapping;

@CsvBindByPosition(position = 1)
@JsonProperty
private String title;

@CsvBindByPosition(position = 2)
@JsonProperty
private String description;

@CsvBindByPosition(position = 3)
@JsonProperty("company_id")
private Long companyID;


Here is the test case class
package com.j2c.feeds2g.services;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.j2c.feeds2g.models.Job;
import com.j2c.feeds2g.services.base.BaseService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-context.xml" })
public class CsvMappingServiceTest extends BaseService {

@Autowired
@Qualifier("csvMappingService")
private CSVMappingService<Job> csvMappingService;

@Test
public void dummy() {
Assert.assertTrue(true);
}

@Test
public void testCSV() {
List<Job> jobs = csvMappingService.toJava(getFile("data/jobs.txt"), Job.class);
Assert.assertNotNull(jobs);
logger.debug(jobs.get(0).toString());
logger.debug(jobs.get(1).toString());
csvMappingService.toCSV(getFile("data/jobs_output.txt"), jobs);
}

}

Change the base class to support looking for the file in data directory
package com.j2c.feeds2g.services.base;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class BaseService {

protected final Logger logger = LoggerFactory.getLogger( this.getClass() );

protected String getFile(String fileLocation){
return getClass().getClassLoader().getResource("").getFile() + File.separator + fileLocation;
}

}

Dependencies
<!-- openCSV -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.9</version>
</dependency>

References:
http://opencsv.sourceforge.net/
https://sourceforge.net/p/opencsv/source/ci/master/tree/src/test/java/com/opencsv/bean/BeanToCsvTest.java
https://sourceforge.net/p/opencsv/source/ci/master/tree/src/test/java/com/opencsv/bean/StatefulBeanToCsvTest.java#l216
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值