Develope/Programming

[JAVA] CSV Mapper 를 이용하여 CSV 파일 매핑하기

고로이 2018. 6. 1. 11:23
반응형

지금까지는 Buffered Reader로 파일을 리드하고 split을 주로 햇는데


좀 올드해보이기도 하고,,



json을 파싱할 때 자주 썻던 jackson에 비슷한 기능이 잇기에 라이브러리를 사용해보앗다




Jackson Dataformat Csv의 api를 사용했다.


메이븐에 아래와 같이 추가해준다.

<properties>

<jackson-dataformat-csv.version>2.9.0</jackson-dataformat-csv.version>
</properties>

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>${jackson-dataformat-csv.version}</version>
</dependency>



파싱하는 함수는 아래와 같다

Class T로 만들엇는데 오 재밋다.. 이거 쓸려면 인터페이스를 만들ㅈㅏ

public <T> List<T> parseCsvToObject(Class<T> responseClass, File file, CsvSchema schema){
List<T> results = new ArrayList<>();
try {
CsvMapper csvMapper = new CsvMapper();
MappingIterator<T> mappingIterator = csvMapper.readerFor(responseClass).with(schema).readValues(file);

results = mappingIterator.readAll();
}catch (Exception e){
logger.error(ExceptionUtils.getStackTrace(e));
}
return results;
}





파일은 모두 알테고, 

스키마 정의부분에는 아래와 같이 하였다.

public CsvSchema csvSchema() {
CsvSchema bootstrap = CsvSchema.builder()
.addColumn("timeIndex",CsvSchema.ColumnType.STRING)
.addColumn("totalPower",CsvSchema.ColumnType.STRING)
.addColumn("savings",CsvSchema.ColumnType.STRING)
.addColumn("fanElec",CsvSchema.ColumnType.STRING)
.addColumn("groupIndex",CsvSchema.ColumnType.STRING)
.addColumn("date",CsvSchema.ColumnType.STRING)

.build().withHeader();

return bootstrap;
}

각각 addColumn 이 인덱스를 가지는데

첫번째 인자는 String 타입인 timeIndex 변수와 매핑

두번째 인자는 String 타입인 totalPower 변수와 매핑 등등 

Vo 안에잇는 변수명과 인덱스를 일치해주면 된다



ex) VO

public class SavingEvlVo implements CsvDataVo {
private String date;
private String timeIndex;
private String totalPower;
private String groupIndex;
private String savings;
private String fanElec;


CSV 파일

timeIndex,totalPower,Savings,Fan Elec,groupIndex,date
1,0,0,0,0,2018-05-28
2,0,0,0,0,2018-05-28
3,0,0,0,0,2018-05-28
4,0,0,0,0,2018-05-28





* 적용하기

fileName = "20180527031814.csv";
file = new File(destDir + "/" + fileName);
List<SavingEvlVo> voList = parseCsvToObject(SavingEvlVo.class,file,savingEvlVo.csvSchema());


*

사실 첫라인을 헤더로 만들 수 있다고 하는데

나는 자꾸 에러가 나기도 하고, 변수명도 달라서 그냥 포기햇다

반응형