Comma Separated Values (CSV)









한 레코드의 각 필드를 쉼표(,)로 구분한 텍스트 기반 데이터 파일 포맷이다. 확장자는 .csv이며 MIME 형식은 text/csv이다. 한글로 씨에스브이 라고 읽는다.


홍길동 1992년 7월 17일 국어100점 영어90점 수학70점

희동이 1992년 4월 3일 국어90점 영어100점 수학100점

예를 들어 학생기록부에 위와 같은 데이터를 CSV로 저장한다고 하면

홍길동,1992,7,17,100,90,70
희동이,1992,4,3,90,70,100

과 같이 저장된다. CSV포맷의 줄 바꿈 문자는 라인 피드(LF) 또는 캐리지 리턴-라인 피드(CRLF)를 사용한다.


단점은 데이터 자체에 쉼표가 들어가 있는 형태의 데이터를 취급하기 곤란하다. 예를 들어 천 단위마다 쉼표를 찍어 놓은 금액 데이터를 CSV에 직접 집어넣으면 문제가 된다. 따옴표로 감싸는 등의 해법이 있지만 보통 더 쉽게 구분자를 탭 문자(\t)로 바꾼 TSV 등을 사용한다. 사실 CSV라는 데이터 구조 자체에 무슨 표준이 있는 것은 아니라서 구분자를 뭘로 쓰든 데이터를 주고받는 사이에 약속만 지키면 된다. CSV에서 사용하는 특수 문자는 필드 구분자와 레코드 구분자 둘 뿐이고 인용이나 이스케이프 문자는 선택 사양이다. 일반적으로 데이터 생산자가 CSV데이터의 성격을 보고 필드 안에 들어갈 확률이 가장 적은 문자를 필드 구분자로 정한다. 레코드 구분자 역시 필드에 줄바꿈이 자주 쓰일 경우 라인 피드 대신 널 문자(NULL)를 쓰기도 한다.[1]

일반적으로 CSV파일의 무결성을 검증할 때는 한 줄의 콤마 수를 센다. 모든 줄의 콤마 수는 다 같아야 하며 더 적거나 더 많은 줄이 발견되면 오류로 판단해 걸러내는 등의 적절한 처리를 할 필요가 있다. 가장 일반적으로 발견되는 오류는 다음과 같다.

- 내용에 콤마가 들어가서 한 줄의 콤마 수가 몇 개 늘어나는 경우
- 줄바꿈 문자가 누락돼 한 줄의 콤마 수가 두 배로 늘어나는 경우
- 내용에 줄바꿈 문자가 들어가서 두 줄 이상의 콤마 수가 정상보다 적은 경우
- 줄바꿈 문자의 캐리지 리턴(CR)을 걸러내지 못해 마지막 필드의 데이터가 깨지는 경우
- 따옴표가 정상적으로 닫히지 않아 임의의 필드와 레코드가 한 필드 안에 인용돼 들어간 경우
- 마지막 줄의 라인 피드 누락으로 마지막 줄 데이터를 읽지 못한 경우
- 첫 줄에 헤더 텍스트가 들어간 CSV를 사용할 때 첫 줄을 건너뛰지 않은 경우



CSV 형식




1.  Each record is located on a separate line, delimited by a line break (CRLF).  


->  레코드는 줄 바꿈 (CRLF)으로 구분할수 있다.


For example:

       aaa,bbb,ccc CRLF

       zzz,yyy,xxx CRLF


2.  The last record in the file may or may not have an ending line break. 

 

-> 파일의 마지막 레코드 끝에 줄 바꿈 이 있거나 없을수 있다.


For example:


       aaa,bbb,ccc CRLF

       zzz,yyy,xxx


3.  There maybe an optional header line appearing as the first line of the file with the same format as normal record lines.  This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional "header" parameter of this MIME type). 

 

-> 첫번째 행에는 일반 레코드와 동일한 형식을 갖는 헤더행이 표시될 수 있다. 이 헤더는 파일의 필드에 해당하는 이름을 포함하며 나머지 파일의 레코드와 동일 한 수의 필드를 포함해야한다. ( 헤더 행의 유무는 옵션의 "header"매게  변수를 통해 표시되어야 한다.)

For example:


       field_name,field_name,field_name CRLF

       aaa,bbb,ccc CRLF

       zzz,yyy,xxx CRLF



4.  Within the header and each record, there may be one or more fields, separated by commas.  Each line should contain the same number of fields throughout the file.  Spaces are considered part of a field and should not be ignored.  The last field in the record must not be followed by a comma.  


-> 헤더와 각 레코드 내에 하나 이상의 필드는 쉼표로 구분된다. 각 줄에는 동일한 내용이 포함되어야한다. 파일 전체의 필드 수. 공백은 파일의 일부로 간주되며 무시해서는 안된다. 마지막 레코드의 입력란은 쉼표가 와서는 안된다.


For example:


       aaa,bbb,ccc


5.  Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all).  If fields are not enclosed with double quotes, then double quotes may not appear inside the fields. 


-> 각 필드는 큰 따옴표로 묶을 수도 있고 안묶일 수도 있다. (Microsoft Excel과 같은 일부 프로그램에서는 큰 따옴표를 사용하지 않는다.) 

필드가 큰 따옴표로 묶이지 않으면 필드 안에 큰 따옴표는 나타나지 않을 수 있다.


For example:


       "aaa","bbb","ccc" CRLF

       zzz,yyy,xxx


6.  Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.  


-> 줄 바꿈 (CRLF), 큰 따옴표 및 쉼표가 포함 된 필드는 큰 따옴표로 묶어야합니다.


For example:


       "aaa","b CRLF

       bb","ccc" CRLF

       zzz,yyy,xxx


7.  If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote.  


-> 필드를 둘러싸는 데 큰 따옴표가 사용된 경우에는 다른 큰 따옴표를 사용하여 필드 안에 표시된 큰 따옴표를 먼저 처리하여 해당 필드에서 벗어나야 한다.


For example:


       "aaa","b""bb","ccc"


7번 규칙에대한 설명을 덫 붙히자면 이스케이프 문자가 앞에추가되어야한다.

예를 들어 " 를 csv 포맷으로 바꾸면 최종 문자열이 """" 이 된다. 왜그럴까?


우선 6번의 규칙과 7번의 규칙이 혼합된 결과라고 보면된다. 더블쿼테이션 문자는 6번 규칙에의해 ""에 묶여야한다.

그렇게 되면 문자의 형태는 """ 이 된다.

7번 규칙에 의해 " 인 더블쿼테이션이 들어간 필드에는 이스케이프 문자가 추가된다. 그렇게 되면 """형태가 된다.


눈치가 빠른 사람이라면 알겠지만 하나의 필드를 묶는 더블쿼테이션은 빨간색 필드안에 오리지널 문자 레코드는 검은색 그 레코드의 이스케이프 문자는 파란색으로 구분 해놓은것이다.







+ Recent posts