반응형
  • 데이터 베이스에서 조회한 데이터를 opencsv를 사용하여 csv파일로 저장하는 코드
val writer: FileWriter = FileWriter("output.csv")
val strategy: CustomMappingStrategy<ReportDTO> = CustomMappingStrategy<ReportDTO>()
strategy.type = ReportDTO::class.java

val beanToCsv: StatefulBeanToCsv<ReportDTO> =
    StatefulBeanToCsvBuilder<ReportTravelDTO>(writer)
        .withMappingStrategy(strategy)
        .build()

beanToCsv.write(travelDataList)
writer.close()

해당 코드 결과는 이렇게 나온다.

"seq","gender","region2"
"296","1",""

하지만 원하는 형태는 데이터가 있는 경우에는 큰따옴표를 제거하고 null이거나 데이터 내부에 콤마(,)가 들어있는 경우에 한해서만 큰따옴표로 묶는것이기에 다른 방법이 필요했음.

opencsv에서 제공하는건 withApplyQuotesToAll(false) 옵션으로 설정했을때 내용에 콤마가 있는경우는 큰따옴표로 묶어주지만 공백일 경우에는 묶어주지 않는다.

원하는 조건을 만족시키려면 결국 CSVWriter를 상속받아서 stringContainsSpecialCharacters를  overriding 해야 함.

import com.opencsv.CSVWriter
import java.io.Writer

class CustomCsvWriter(writer: Writer?) : CSVWriter(writer) {

    override fun stringContainsSpecialCharacters(line: String): Boolean {
        var result: Boolean = false

        if (line.isEmpty()) result = true
        if (line.contains(',')) result = true
        return result
    }
}

내가 원하는 조건에 true값을 주고 실제 csv를 만드는 코드에서 withApplyQuotesToAll(false)를 설정해야 커스텀 한 결과가 반영된다.

 

val writer: FileWriter = FileWriter("파일.csv", Charset.forName("utf-8"))  
val strategy: CustomMappingStrategy<ReportDTO> = 
	CustomMappingStrategy<ReportDTO>()
    
strategy.type = ReportDTO::class.java

val beanToCsv: StatefulBeanToCsv<ReportDTO> =
    StatefulBeanToCsvBuilder<ReportTravelDTO>(CustomCsvWriter(writer))
        .withMappingStrategy(strategy)
        .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
        .withApplyQuotesToAll(false)
        .build()

beanToCsv.write(DataList)
writer.close()

커스텀한 CsvWriter를 적용한 코드의 결과는

seq,gender,region2
296,1,""

원하는 구조로 바뀐걸 확인 할 수 있다.

 

728x90
반응형

+ Recent posts