csv 포맷은 보통 엑셀에서 많이 보셨을겁니다. Comma Serarated Value 의 약자구요 간단히 얘기하면 쉼표(,)로 데이터(필드)를 구분하여 표시하는 방법입니다. 업무에서 많이 쓰이지만 확실히 밝혀지지 않은 ^^... (적어도 저한테는 그랬습니다.)
예를 들어 다음과 같이 3개의 항목으로 구성된 한줄의 데이터는 이렇게 csv로 표현됩니다.
----
항목1 : 홍길동
항목2 : 서울시 서초구
항목3 : 사과(줄바꿈)
복숭아(줄바꿈)
배
----
홍길동,서울시 서초구,"사과(줄바꿈)
복숭아(줄바꿈)
배"
----
위에서 보듯이 기본 규칙은 항목간 구분은 쉼표(,) 입니다.
그리고 항목3과 같이 특수한 경우 따옴표(")로 싸서 표현합니다. 위의 경우는 줄바꿈문자가 들어간 경우입니다.
이외에도 따옴표로 항목데이터를 싸줘야 하는 경우는 데이터자체에 따옴표(")나 쉼표(,)가 들어가는 경우입니다. 그리고 데이터로써의 따옴표(")는 따옴표두개("")를 연달아 쓰는 걸로 표현됩니다.
즉 데이터가 다음과 같은 경우 이렇게 표현됩니다.
----
항목1 : 홍길동
항목2 : 가,나
항목3 : 가"나다라"마
----
홍길동,"가,나","가""나다라""마"
----
이러한사실들은 제가 직접 엑셀에서 csv로 저장하기를 통해 알아낸것이며 csv포맷 자체구 국제 규격같은게 없기때문에 다른 내용이 더 있을수도 있습니다.
이번에 xxx자료수집시스템을 개발하면서 대량의 파일데이터를 DB와 주고 받는 작업이 있어서 알아보게 된것입니다.
하여간 이러한 규칙을 적용하여 일반데이터를 csv로 포맷하는 유틸리티를 하나 만들었습니다. 일단 줄바꿈문자가 한개의 항목으로 들어가는 일은 없기때문에 그 부분에 대한 처리는 빠져있구요. 다른 언어를 쓰시는 분들도 간단하니 참고 하시기 바랍니다.
그리고 CSV파일을 일반 데이터로 디코딩하는 부분이 있는데 이부분은 정확히 위의 로직을 반대로 적용하면 됩니다. 말은그런데... 이걸 프로그래밍으로 구현하다보니 인코딩에 비해 훨씬 복잡해 지더군요. 예상보다 상당히 많이.... 그리고 파일을 읽어서 스트림으로 처리하는 로직을 적용했기때문에 소스가 이것보다는 상당히 길구요. 그래서 csv파일 디코딩하는 부분은 다음에 또 올리겠습니다. 물론 소스와 함께...
----
// java에서 사용법
String converted = CSVUtil.printSCV("홍길동");
----
----
/*
* 파일명 : CSVUtil.java
* 설명 : csv 포맷의 파일관련 유틸
* 작성자 : 김복현
* 최초작성 : 20070420 - printCSV 메소드
* 추가 : 20070509 - decodeCSVRecord 메소드
* 제거 : 20070510 - decodeCSVRecord 메소드를 제거하고 csv읽기기능을 CSVReader 클래스로 분리하여 스트림에서 바로 파싱하도록 함
* 추가 : 20070510 - CR추가(ms환경에서 작성된 파일을 위해)
*/
public class CSVUtil
{
public static char QT = '\"'; // quote
public static char CD = ','; // column delimeter
public static char RD = '\n'; // record delimeter
// for ms windows file
public static char CR = '\r'; // caraget return
public static String COLUMN_DLM = Character.toString(CD);
public static String RECORD_DLM = Character.toString(RD);
public static String QUOTE = Character.toString(QT);
public static String printCSV(String str)
{
if(str==null)
return "";
// 쉼표(,)나 따옴표(")가 포함된 경우가 아니면 그냥 리턴
if(str.indexOf(CD)<0 && str.indexOf(QT)<0)
return str;
return QT+str.replaceAll(QUOTE, QUOTE+QUOTE)+QT;
}
}
----
MS 엑셀에서 csv 포맷으로 저장하기
예를 들어 다음과 같이 3개의 항목으로 구성된 한줄의 데이터는 이렇게 csv로 표현됩니다.
----
항목1 : 홍길동
항목2 : 서울시 서초구
항목3 : 사과(줄바꿈)
복숭아(줄바꿈)
배
----
홍길동,서울시 서초구,"사과(줄바꿈)
복숭아(줄바꿈)
배"
----
위에서 보듯이 기본 규칙은 항목간 구분은 쉼표(,) 입니다.
그리고 항목3과 같이 특수한 경우 따옴표(")로 싸서 표현합니다. 위의 경우는 줄바꿈문자가 들어간 경우입니다.
이외에도 따옴표로 항목데이터를 싸줘야 하는 경우는 데이터자체에 따옴표(")나 쉼표(,)가 들어가는 경우입니다. 그리고 데이터로써의 따옴표(")는 따옴표두개("")를 연달아 쓰는 걸로 표현됩니다.
즉 데이터가 다음과 같은 경우 이렇게 표현됩니다.
----
항목1 : 홍길동
항목2 : 가,나
항목3 : 가"나다라"마
----
홍길동,"가,나","가""나다라""마"
----
이러한사실들은 제가 직접 엑셀에서 csv로 저장하기를 통해 알아낸것이며 csv포맷 자체구 국제 규격같은게 없기때문에 다른 내용이 더 있을수도 있습니다.
이번에 xxx자료수집시스템을 개발하면서 대량의 파일데이터를 DB와 주고 받는 작업이 있어서 알아보게 된것입니다.
하여간 이러한 규칙을 적용하여 일반데이터를 csv로 포맷하는 유틸리티를 하나 만들었습니다. 일단 줄바꿈문자가 한개의 항목으로 들어가는 일은 없기때문에 그 부분에 대한 처리는 빠져있구요. 다른 언어를 쓰시는 분들도 간단하니 참고 하시기 바랍니다.
그리고 CSV파일을 일반 데이터로 디코딩하는 부분이 있는데 이부분은 정확히 위의 로직을 반대로 적용하면 됩니다. 말은그런데... 이걸 프로그래밍으로 구현하다보니 인코딩에 비해 훨씬 복잡해 지더군요. 예상보다 상당히 많이.... 그리고 파일을 읽어서 스트림으로 처리하는 로직을 적용했기때문에 소스가 이것보다는 상당히 길구요. 그래서 csv파일 디코딩하는 부분은 다음에 또 올리겠습니다. 물론 소스와 함께...
----
// java에서 사용법
String converted = CSVUtil.printSCV("홍길동");
----
----
/*
* 파일명 : CSVUtil.java
* 설명 : csv 포맷의 파일관련 유틸
* 작성자 : 김복현
* 최초작성 : 20070420 - printCSV 메소드
* 추가 : 20070509 - decodeCSVRecord 메소드
* 제거 : 20070510 - decodeCSVRecord 메소드를 제거하고 csv읽기기능을 CSVReader 클래스로 분리하여 스트림에서 바로 파싱하도록 함
* 추가 : 20070510 - CR추가(ms환경에서 작성된 파일을 위해)
*/
public class CSVUtil
{
public static char QT = '\"'; // quote
public static char CD = ','; // column delimeter
public static char RD = '\n'; // record delimeter
// for ms windows file
public static char CR = '\r'; // caraget return
public static String COLUMN_DLM = Character.toString(CD);
public static String RECORD_DLM = Character.toString(RD);
public static String QUOTE = Character.toString(QT);
public static String printCSV(String str)
{
if(str==null)
return "";
// 쉼표(,)나 따옴표(")가 포함된 경우가 아니면 그냥 리턴
if(str.indexOf(CD)<0 && str.indexOf(QT)<0)
return str;
return QT+str.replaceAll(QUOTE, QUOTE+QUOTE)+QT;
}
}
----
'java' 카테고리의 다른 글
java.io.File.getCanonicalPath(), getAbsolutePath() (0) | 2008.03.05 |
---|---|
제9회 자바 개발자 컨퍼런스 (0) | 2008.02.04 |
java nio의 주요 클래스인 ByteBuffer 클래스의 주요 메소드를 이해하기 위한 코드 (0) | 2007.12.13 |
java System.in에서 키보드 입력을 받을때 에코되는 문자를 안보이게 처리하기 (0) | 2007.11.16 |
숫자 형식에 대해서 java 정규식 테스트 (1) | 2007.07.24 |