Java Generate/Merge Files(6)OpenCSV

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

猜你喜欢

转载自sillycat.iteye.com/blog/2368881