나는 이 기사를 읽고 있었고이 질문에 대한 올바른 대답이 궁금합니다.
내 마음에 오는 유일한 것은 아마도 일부 국가에서는 소수점 구분 기호가 쉼표이며 CSV로 데이터를 공유 할 때 문제가 될 수 있지만 실제로 내 대답은 확실하지 않습니다.
나는 이 기사를 읽고 있었고이 질문에 대한 올바른 대답이 궁금합니다.
내 마음에 오는 유일한 것은 아마도 일부 국가에서는 소수점 구분 기호가 쉼표이며 CSV로 데이터를 공유 할 때 문제가 될 수 있지만 실제로 내 대답은 확실하지 않습니다.
답변:
CSV 형식 사양은 RFC 4180에 정의되어 있습니다. 이 사양은
CSV 파일에 대한 다양한 해석을 허용하는 공식 사양이 없습니다.
불행히도, 2005 년 이후 (RFC 게시일) 아무런 변화가 없었습니다. 우리는 여전히 다양한 구현을 가지고 있습니다. RFC 4180에 정의 된 일반적인 방법은 쉼표와 같은 문자가 포함 된 필드를 따옴표로 묶는 것입니다. 그러나이 권장 사항이 항상 다른 소프트웨어에 의해 충족되는 것은 아닙니다.
문제는 다양한 유럽 로케일에서 쉼표 문자가 소수점 역할을하므로 0,005
대신 대신 쓰는 것입니다 0.005
. 그러나 다른 경우에는 공백 대신 쉼표를 사용하여 숫자 그룹에 신호를 보냅니다 4,000,000.00
( 예 : 여기 참조 ). 두 경우 모두 쉼표를 사용하면 소프트웨어가 실제로 0,005, 0,1
두 개의 숫자인지 네 개의 다른 숫자 인지 알 수 없기 때문에 csv 파일에서 데이터를 읽는 데 오류가 발생할 수 있습니다 ( 여기의 예제 참조 ).
마지막으로 데이터 파일에 텍스트를 저장하면 세미콜론과 같이 텍스트에서 쉼표가 훨씬 일반적이므로 텍스트를 따옴표로 묶지 않으면 이러한 데이터를 쉽게 읽을 수 있습니다. .
위에서 설명한 문제를 방지하는 RFC 4180과 같은 권장 사항에 따라 CSV 파일을 사용 하는 한 쉼표를 개선하거나 필드 구분 기호 를 악화시키는 것은 없습니다 . 그러나 필드를 따옴표로 묶지 않는 단순화 된 CSV 형식을 사용할 위험이 있거나 권장 사항을 일관되지 않게 사용할 수있는 경우 다른 구분 기호 (예 : 세미콜론)가 더 안전한 접근 방식 인 것 같습니다.
,
드문 구분 기호 대신 사용 하면 데이터를 항상 탈출해야하기 때문에 데이터가 부풀려진 다는 주장 은 사실입니다. 그리고 CSV가 어떻게 작동하는지 알고 있지만 실제로는 그렇지 않다고 생각하는 사람들이 있습니다.
기술적으로 쉼표는 구분 기호로 사용되는 다른 문자만큼 좋습니다. 형식의 이름은 값이 쉼표로 구분됨 (쉼표로 구분 된 값)을 직접 나타냅니다.
CSV 형식에 대한 설명은 쉼표를 구분 기호로 사용합니다.
쉼표를 포함하는 모든 필드는 큰 따옴표로 묶어야합니다. 따라서 데이터를 읽는 데 문제가 발생하지 않습니다. 설명 에서 6 점을 참조하십시오 .
- 줄 바꿈 (CRLF), 큰 따옴표 및 쉼표가 포함 된 필드는 큰 따옴표로 묶어야합니다.
values
쉼표로 구분되어 있기 때문에 가장 좋은 대답 입니다. 유럽 formatting
의 숫자를 암시하는 다른 사람들 은 standard
위의 포인트 6을 올바르게 인용 하기 때문에 csv에는 문제가되지 않습니다 . "올바른 사용"의 차이는 모든 데이터 형식에 존재합니다. 요점은-당신의 데이터를 알고있다. 다른 사람들은 언급 tab
하거나 ;
구분하지만 사용자가 입력 한 데이터를 처리 할 때 쉼표와 동일한 문제가 발생할 수 있습니다 (아마 양식을 통해 데이터베이스에 의해 캡처 됨) 뚱뚱한 손가락을 가졌다 tab
... 짜증 난다)
숫자로 된 숫자 구분자 일뿐 아니라 많은 국가에서 주소 (예 : 고객 주소 등)의 일부이기도합니다. 일부 국가에는 잘 정의 된 주소가 짧지 만 다른 국가에는 같은 줄에 두 개의 쉼표가 포함 된 긴 주소가 있습니다. 좋은 CSV 파일은 이러한 모든 데이터를 큰 따옴표로 묶습니다. 그러나 지나치게 단순하고 불완전하게 작성된 파서는 읽기와 차별화를 제공하지 않습니다. (그러면시의 인용과 같이 데이터의 일부로 큰 따옴표를 사용하는 데 문제가 있습니다).
@Tim의 대답은 정확하지만 "csv"에는 일반적인 표준이 없습니다. 특히 이스케이프 규칙이 전혀 정의되어 있지 않으므로 한 프로그램에서 읽을 수 있지만 다른 프로그램에서는 읽을 수없는 "형식"으로 이어집니다. . 이것은 태양 아래의 모든 "프로그래머"가 단지 "oooh csv- 나는 내 자신의 파서를 구축 할 것"이라고 생각한다는 사실에 의해 화려하게된다. 그런 다음 모든 엣지 케이스를 놓칩니다.
또한 csv에는 메타 데이터 또는 열의 데이터 유형을 저장하는 기능이 전혀 없으므로 데이터를 이해하기 위해 읽어야하는 여러 문서가 있습니다.
쉼표 구분 기호를 버리고 탭 문자를 사용하면 훨씬 더 성공할 수 있습니다. .CSV라는 파일을 그대로 둘 수 있으며 대부분의 프로그램으로 가져 오는 것은 일반적으로 문제가되지 않습니다. 파일을 가져올 때 쉼표가 아닌 TAB로 구분하면됩니다. 데이터에 쉼표가 있으면 잘 알고 있듯이 쉼표로 구분하여 지정할 때 문제가 발생합니다.
|
집에서 만든 csv와 같은 레코드의 텍스트 파일 (책 제목 및 기타 문서 메타 데이터 포함)의 구분 기호로 좋은 결과를 얻었습니다 . |
내가 작업하는 데이터에서 절대 발생하지 않으므로 어떤 종류의 따옴표도 확인하지 않고 단순히 분리 / 결합하는 펄 스크립트를 작성할 수 있습니다. 이것은 MS Access 데이터베이스에서 저장된 메타 데이터를 처리하는 일회성 프로젝트를위한 것입니다. 대규모 프로젝트의 경우 또는이 파일 형식으로 데이터를 장기적으로 유지하려는 경우보다 강력한 것을 선택하십시오! 이번 달의 배치가 문제가 발생하면 항상 무언가를 조정할 수 있습니다.
split
Stata에 대한 명령을 작성할 때 무엇보다도 Perl이 수행 한 것과 수행하지 않은 것을 확인하기 위해 Perl을 살펴 보았습니다. 소스 코드가 아닌 기능 만 제공됩니다.
cut
, sort
하고 uniq
.
ASCII는 아래에 ascii (7) * nix 매뉴얼 페이지의 스 니펫에 표시된 것처럼 4 개의 "분리 자"문자를 제공합니다.
Oct Dec Hex Char
----------------------
034 28 1C FS (file separator)
035 29 1D GS (group separator)
036 30 1E RS (record separator)
037 31 1F US (unit separator)
이 답변 은 의도 된 사용법에 대한 적절한 개요를 제공합니다.
물론, 이러한 제어 코드는보다 널리 사용되는 구분 기호의 친숙성 (가독성 및 입력)이 부족하지만 프로그램 간 내부 및 / 또는 임시 데이터 교환을위한 적절한 선택입니다.
문제는 쉼표가 아닙니다. 문제는 인용입니다. 사용하는 레코드 및 필드 구분 기호에 관계없이 컨텐츠에서이를 구분할 수 있도록 준비해야합니다. 따라서 인용 메커니즘이 필요합니다. 그런 다음 인용 문자도 표시 할 방법이 필요합니다.
RFC 4180 표준을 따르면 모든 사람이 모든 것을 간단하게 만들 수 있습니다.
나는 개인적 으로이 문제가 발생한 프로그램의 출력을 수정하기 위해 스크립트를 작성해야 했으므로 약간 무섭습니다. "아마 수정"은 내 데이터에 효과가 있었지만 실패한 상황을 볼 수 있음을 의미합니다. (이 프로그램의 방어에서는 표준보다 먼저 작성되었습니다.)