최근 수정 시각 : 2024-12-12 11:49:33

CSV

1. 데이터 직렬화 포맷
1.1. 구조1.2. 특징1.3. 장단점
1.3.1. 장점1.3.2. 단점
1.4. 무결성 검증1.5. 다른 포맷과의 비교
2. 경영학 용어
2.1. 개요2.2. 상세
3. 전자담배의 한 종류

1. 데이터 직렬화 포맷

Comma Separated Values

컴퓨터 용어로, 표 형태의 데이터[1]를 저장하는 파일 형식이다. 주로 쓰이는 확장자는 .csv이며 MIME 형식은 text/csv이다. 전부 자음이라 한글로는 보이는 그대로 '시에스브이'라고 읽는다.

1.1. 구조

하나의 CSV 파일은 하나의 독립된 2차원 데이터를 나타낸다.
각 줄은 하나의 행(row)에 해당하고 각 열(column) 사이에는 쉼표(,)를 넣어 구분하며, 이때 모든 행은 같은 개수의 열을 가져야 한다. 줄 바꿈 문자는 라인 피드(LF, 이스케이프 문자로는 \\n) 또는 캐리지 리턴과 라인 피드(CRLF 병용)를 사용한다.

예시)
학생 기록부에 아래와 같은 표 데이터가 있다고 하자.
이름 생년 국어 점수 영어 점수 수학 점수
홍길동 1992년 7월 17일 100점 90점 70점
희동이 1992년 4월 3일 90점 100점 100점

위의 데이터를 CSV 형식으로 저장하면 아래와 같은 형태가 된다.
이름,생년,월,일,국어 점수,영어 점수,수학 점수
홍길동,1992년,7월,17일,100점,90점,70점
희동이,1992년,4월,3일,90점,100점,100점

1.2. 특징

사실 CSV라는 포맷은 표준적으로 정의된 스키마(schema)나 데이터 타입이 있는 게 아니다. 구분자를 뭘로 쓰든 데이터를 주고받는 사이에 약속만 지키면 된다. 단지 주로 쓰는 구분자가 콤마일 뿐.

CSV에서 사용하는 특수 문자는 필드 구분자와 레코드 구분자 둘뿐이고 인용이나 이스케이프 문자는 선택 사양이다. 일반적으로 데이터 생산자가 CSV 데이터의 성격을 보고 필드 안에 들어갈 확률이 가장 적은 문자를 필드 구분자로 정한다. 레코드 구분자 역시 필드에 줄 바꿈이 자주 쓰일 경우 라인 피드 대신 널 문자(NULL)를 쓰기도 한다. 하지만 레코드 구분자에 손대면 표준 텍스트 에디터로 내용 확인이 거의 불가능해지기 때문에 필드에 줄 바꿈 문자가 자주 등장할 경우 CSV 말고 다른 포맷을 고려한다.

1.3. 장단점

1.3.1. 장점

표의 형태를 직관적으로 나타내는 간단한 형식이라 이해하기 쉬우며[2], 다른 복잡한 포맷에 비해 CSV는 별다른 파서/인코더가 필요 없이 기초적인 문자열 조립만으로 읽거나 쓸 수 있기 때문에 소프트웨어로 처리하는 것도 쉽다. 텍스트 기반 형식이라 사람이 직접 읽고 수정하는 것도 가능하다. XML과 같은 다른 텍스트 기반 형식에 비해 거의 최소에 가까울 만큼 간결해서 차지하는 용량도 적다. 용량이 적을수록 대용량의 데이터[3]를 다루거나 요청 등으로 보내기 유리해지며[4] 단순하고 간단한 포맷이라 범용성도 뛰어나서, 대부분의 스프레드시트 소프트웨어 중 CSV를 지원하지 않는 경우가 드물 정도이며 뛰어난 범용성 때문에 한쪽에서 다른 소프트웨어로 데이터를 옮기기도 편리하다. 이런 표현이 익숙하지 않은 사람들을 위해, CSV를 표 기반으로 바꿔서 보여주는 툴도 다른 포맷들에 비해 많은 편이다.

1.3.2. 단점

단점은 데이터에 쉼표가 포함된 내용을 취급하기 곤란하다는 것. 예를 들어 천 단위마다 쉼표를 찍어 놓은 금액 데이터(100,000)를 CSV에 직접 집어넣으면 나중에 해석할 때 서로 다른 열로 취급되므로 문제가 된다.

해결책은 쉼표가 포함된 문자열을 따옴표로 감싼다.[5]

쉼표 대신 다른 특수 문자를 구분자로 쓰는 방법도 있다. 주로 탭 문자(\t)를 구분자로 사용하는데 아예 Tab-Separated Values(TSV)라고 따로 부른다.

문자열을 URL escape code로 인코딩해서 콤마를 제거하는 방법도 존재한다. 다만 이 경우 데이터를 받는 사람이 그 사실을 모르면 해석에 문제가 생길 수 있다.

간혹 텍스트 편집기를 사용한 정규 표현식 전처리가 고려되기도 한다.

1.4. 무결성 검증

일반적으로 CSV 파일의 무결성을 검증할 때는 한 줄의 콤마 수를 센다. 모든 줄의 콤마 수는 다 같아야 하며 더 적거나 더 많은 줄이 발견되면 오류로 판단해 걸러내는 등의 적절한 처리를 할 필요가 있다. 가장 일반적으로 발견되는 오류는 다음과 같다.
  • 내용에 콤마가 들어가서 한 줄의 콤마 수가 몇 개 늘어나는 경우
  • 줄 바꿈 문자가 누락돼 한 줄의 콤마 수가 두 배로 늘어나는 경우
  • 내용에 줄 바꿈 문자가 들어가서 두 줄 이상의 콤마 수가 정상보다 적은 경우
  • 줄 바꿈 문자의 캐리지 리턴(CR)을 걸러내지 못해 마지막 필드의 데이터가 깨지는 경우
  • 따옴표가 정상적으로 닫히지 않아 임의의 필드와 레코드가 한 필드 안에 인용돼 들어간 경우
  • 마지막 줄의 라인 피드 누락으로 마지막 줄 데이터를 읽지 못한 경우
  • 첫 줄에 헤더 텍스트가 들어간 CSV를 사용할 때 첫 줄을 건너뛰지 않은 경우

최악은 CSV의 필드 안에 게시판 본문 데이터를 그냥 담는 것이다. 게시글 본문에는 쉼표, 따옴표, 줄 바꿈 문자가 모두 들어가기 때문에 데이터가 어떻게 깨졌는지, 심지어는 이게 깨진 레코드인지조차 모를 수도 있다. 예를 들어 게시글 본문 내용 자체가 CSV 데이터일 경우 존재하지도 않는 유령 게시글이 하나 등록될 수 있다. CSV Injection 이 경우에는 아예 CSV 자체를 안 쓰는 게 정신 건강에 좋다. 참고로 게시판 본문 데이터가 HTML일 경우가 끝판왕으로 XML을 써도 힘들다.[6][7]

테이블 덤프 등의 이유로 무조건 CSV를 써야 한다면 아예 게시판 본문 데이터 전체를 URI Encode하고 무조건 따옴표로 인용하면 데이터 크기가 커지고 편집기로 직접 못 읽지만 어쨌든 문제를 회피할 수 있다. 자바스크립트 사용자라면 encodeURI()가 아닌 encodeURIComponent() 함수를 써야 제대로 이스케이프 처리 된다.

1.5. 다른 포맷과의 비교

보다시피 데이터 오염에 대단히 취약한 포맷이다 보니 본격적인 데이터 교환 포맷으로는 XMLJSON을 쓴다. 둘 중 XML이 상대적으로 데이터 오염에 더 잘 견딘다. 하지만 CSV는 현재도 IT 및 산업계에서 널리 사용 중인데 가장 결정적인 이유는 데이터의 크기가 작기 때문이다. JSON만 돼도 CSV 대비 2배에서 3배 이상 데이터의 크기가 커지기 일쑤인 데다 CSV 파서(parser)는 대단히 간단해서 인용 및 이스케이프 처리를 하지 않는 CSV 파서는 대부분의 프로그래밍 언어에서 코드 한 줄로 가능하다. 게다가 파일 일부에 문제가 생겨도 CSV의 오류는 보통 레코드 단위로 재동기화가 가능하다. JSON은 따옴표나 중괄호 같은 게 하나라도 누락되면 전체 JSON 파일의 로드에 실패하는 치명적인 문제가 있다. XML의 경우에는 보통 문제가 생긴 엘리먼트의 부모 엘리먼트에까지만 오류가 전파되므로 CSV보다 더 강한 내결함성이 있지만 JSON보다도 더 데이터의 크기가 커져버린다. 만약 로드하려는 데이터가 기가바이트 단위를 바라본다면 몇 퍼센트의 데이터 오버헤드도 무시할 수 없는 문제가 되는데 이런 분야에서 CSV가 활약하는 것이다. 덤으로 CSV는 압축도 잘되고 스트림 압축이 가능해서 데이터의 일부만 수신된 상태에서도 데이터 적재 작업을 시작할 수 있다.[8]

한 가지 팁으로 대용량의 CSV 파일은 리눅스에서는 split 유틸리티를 사용해서 원하는 크기로 분할 가능하고, cat 명령어 또는 copy /b 명령어로 다시 합칠 수 있다. 실무에서는 용량이 큰 CSV 처리는 DB에서 보다 안정적으로 처리할 수 있기 때문에 DB로 변환하기도 하며, SQL DBMS에서도 명령어 한 줄로 CSV to Table을 지원한다.

2. 경영학 용어

2.1. 개요

Creating Shared Values

하버드의 경영학자인 Michael Porter에 의해 처음 제안된 개념으로, CSR에서 한 단계 나아간 형태의 기업 운영 방식이다. 해당 용어 자체를 제목으로 한 "Creating Shared Values"라는 에세이에 등장하였으며, 기업에게 사회적 책임을 묻는 시대에 현실적인 해결안을 내놓은 방안으로 평가받는다.

2.2. 상세

해당 개념은 현대 기업이 사회의 요구와 본인의 목적 사이의 갈등을 해결하기 위한 방법론적 측면에서 등장한 개념이다. 시대가 나아갈수록 기업에게 사회적 책임을 요구하는 목소리는 점점 커지지만, 기업이란 애초에 돈을 버는 것에만 집중하게끔 만들어진 집단이므로 이러한 일을 해내는 것에 있어서 어려움을 겪는데, 이러한 문제를 해결하기 위해 등장한 것.

기업은 돈을 버는 일을 가장 잘하는 집단이므로, 별도로 착한 일을 만들어서 하기보다는, 기업 차원에서 사회와 공유하는 가치창출하여 이를 기업의 핵심 자산으로 삼고 발전시켜 나가면 돈을 벌려는 기업의 속성과 사회적 가치를 실천하라는 사회의 목소리를 동시에 충족시킬 수 있다는 내용이다.

기존의 CSR과 비교해서 이해하면 좀 더 빠르게 이해할 수 있는데, 기존의 CSR은 그저 단순히 사회에 필요하고 좋은 일을 해주는 것에 머물러 있었다면, CSV는 기업의 핵심 역량과 결부된 사회적 가치를 만들어서 이를 키워나가는 방식으로 기업을 성장시키면서도 사회에게 좋은 일을 해주는 방식이란 점에서 차이가 난다.

예컨대, 삼성전자라는 기업은 전자 회사이기 때문에, 어려운 이웃을 돕기 위해 기부를 하거나, 임직원이 연탄을 나르거나, 자연 보호를 위해 나무를 심는 일 따위는 CSR 차원에서는 긍정적인 일이지만, 까놓고 보면 삼성전자가 하기에는 별로 잘하지도 않는 일이고, 기업 자체에도 그닥 도움이 되지 못한다.

3. 전자담배의 한 종류

Closed System Vaporizor

파일:상세 내용 아이콘.svg   자세한 내용은 액상형 전자담배/기기 문서
1.1번 문단을
부분을
참고하십시오.

[1] 쉽게 비유하면 스프레드시트를 생각하면 된다.[2] 다만 너무나도 단순무식한 포멧이라 양이 많아지면 인간이 이해하기 힘들어진다. 100열 100행의 표를 저렇게 나타내면 어지러울 수밖에 없다.[3] 특히 IT 기술 중에서도 압도적으로 대규모의 데이터가 오가는 머신 러닝 등에 자주 사용되는데, 대용량의 시계열 데이터를 CSV로 주고받거나, 비트맵 이미지를 학습 전 미리 인코딩을 풀어 놓는 전처리 과정을 거치는데, 이때 BMP도 사용되지만 더 극단적인 경우(예를 들어 색상 정보를 지우고 모노 채널로만 학습하는 경우) 이미지를 그대로 CSV로 변환하기도 한다.[4] 그러나 단점 때문에 웹 API는 대부분 JSON을 사용한다.[5] 이때 따옴표도 이스케이프하려면 따옴표를 두 번 쓰거나, 따옴표 앞에 \를 쓰면 된다.[6] CDATA로 이스케이핑한다. 본문 내에 CDATA를 쓴 경우에는 필터로 날려버리거나 HTML 엔티티로 이스케이프하고 저장한다.[7] 모든 텍스트 기반 자료 구조를 다룰 때는 해당 자료 구조의 필드에 '자기 자신의 데이터'를 담는 경우를 염두에 둬야 한다. 아예 처음부터 입력을 막거나 또는 이스케이프 방법을 제공해야만 한다. 바이너리 기반 자료 구조는 보통 데이터 필드의 정확한 길이를 해당 필드를 읽기 전에 알 수 있도록 배려하기 때문에 이런 문제가 덜하다.[8] XML도 SAX 파서 사용시 스트림 전송이 가능하다