반응형
- 데이터 베이스에서 조회한 데이터를 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
반응형
'개발라이프' 카테고리의 다른 글
SSH 접속시 발생하는 Host key verification failed 오류 (0) | 2022.11.10 |
---|---|
Flutter 삼항연산자 vs 이중물음표(??) (0) | 2022.10.11 |
Flutter GetX에서 arguments사용하기 (0) | 2022.06.22 |
Aerospike namespace 설정 (0) | 2022.03.24 |
Docker container 실행시 오류나는 경우 확인 방법 (0) | 2022.03.22 |