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
Java Generate/Merge Files(6)OpenCSV
猜你喜欢
转载自sillycat.iteye.com/blog/2368881
今日推荐
周排行