프로젝트/xls(x)<->csv

xls <-> csv 변환기 - 1

haema_ 2024. 1. 28. 23:02
728x90

우선 excel에서 값을 읽어오는 것 자체는 apache의 poi 라이브러리로 가능하고, 방법도 그리 어렵지 않으니 설명은 생략하고 만드는 과정에서의 고려사항과 트러블 슈팅을 위주로 기술하려 한다.

 

일단 변환을 구현하기 위해 csv가 뭔지, 어떤 식으로 변환되는 건지 알아야했다.

csv는 comma separated value의 약자로, 콤마(,)로 값이 분리되는 파일 형식이다.

 

엑셀에서

이런 값이 있다고 하면,

 

csv로 변환할 경우

이렇게 변환되는 것이다.

 

딱 저기까지 알고 코드를 짜려고 보니 바로 첫 번째 난관에 봉착했다.

'그럼 엑셀 값에 콤마(,)가 들어있으면 어떻게 되는데?'

 

거두절미하고 excel 자체 기능을 통해 실험해보았다.

 

 

 

이렇게 넣고 excel에서 .csv 로 다른이름 저장 후 메모장으로 켜봤다.

콤마(,)가 들어있는 셀 값 전체를 큰 따옴표(" ") 로 감싸서 escape하는 것을 볼 수 있다.

그렇게 코드를 짜려고 보니, 바로 두 번째 난관에 봉착했다.

'그럼 엑셀 값에 큰 따옴표(")가 들어있으면?????'

 

..실험해보자

 

혹시 몰라 두개가 합쳐진 상황도 테스트케이스로 추가해봤다.

 

조금 난해해보이지만, 찬찬히 규칙을 찾다보면

D2에 있는 " 하나는 """"(총 4개)로 변환된 것을 볼 수 있고,

E2에 있는 ",,"를 보면 """,,""" (,, 기준 양 옆 3개씩)로 변환된 것을 확인할 수 있다.

각 값 양 끝의 "는 셀 전체의 escape라는 점으로 미루어 보아,

일단 전체 escape를 위해 " "로 감싸진 값 안에서 큰따옴표 하나(")는 큰따옴표 2개("")로 변환되는 것을 확인할 수 있었다.

 

다른 테스트케이스 검증

D3 셀 값 = """"(큰 따옴표 4개)

D3 -> csv 변환된 값 = """""""""" (큰 따옴표 10개)
양쪽 끝 escape(2개) 이후 4개x2(8개) = 10개

 

결국, 변환 로직을 직접 작성해보자면

1. 각 셀 값을 읽으면서 셀에 콤마(,) 또는 큰 따옴표(")가 들어있는지 확인하고

2. 큰 따옴표(")가 들어있는 경우 " 를 ""로 replace해준다.

3. 둘 중 하나라도 들어있으면 시작과 끝에 큰 따옴표(" ") 를 씌운다.

4. 검증 및 치환된 값을 변환기에 입력한다.

5. 콤마(,)를 추가해준다. 만약 row의 마지막 값이라서 다음 row로 넘어가야 하는 경우 콤마(,)를 추가하지 않고 개행해준다.

 

를 엑셀 전체를 읽으면서 반복해주면 되겠다.

csv파일 작성 자체는 그냥 확장자만 .csv 이름을 달아 놓고 Java에서 제공하는 Writer 중 하나를 사용하여 입력해주면 되는데,

몇 가지 고려할 점이 더 있었다.

상세 내용은 이후 포스팅에서 추가로 다루어보겠다.

 

 

반응형

'프로젝트 > xls(x)<->csv' 카테고리의 다른 글

xls <-> csv 변환기 - 3  (0) 2024.03.04
xls <-> csv 변환기 - 2  (0) 2024.02.01
xls <-> csv 변환기 - 0  (0) 2024.01.28