구분 된 파일을 처리하는 가장 좋은 방법


16

따라서 일반적으로 CSV 파일은 쉼표와 반환 문자를 필드 및 줄 구분 기호로 사용합니다.

이 두 문자를 모두 포함 할 수있는 텍스트에 명백한 문제가 있습니다.

분명히 옵션이 있지만 (이스케이프 처리) 사람들이 어떻게 처리합니까? 파이프 나 틸다 같은 다른 문자를 사용 하시겠습니까? 그들을 탈출? 구분 된 파일을 사용하지 마십시오. 2010 년 이후 XML이 생겼습니까?

최소한의 노력으로 문제가 보이지 않을 가능성을 찾으십시오.

(확실히 말하면 이것은 더 단단한 것이 아니라 호기심에 대한 질문입니다. 그것은 데이터를 가지고 노는 시간과 시간에 대해 항상 올라 왔으며 항상 둥글게되었지만 보통은 조금 더럽고 더러운 느낌입니다. 다른 사람들의 경험이 무엇인지 궁금했습니다.)


CSV 사용에 대해 신중하게 생각하십시오-다루기 쉽고 훌륭합니다 (일반적인 이스케이프 규칙에 대한 답변 참조).하지만 그다지 상호 작용할 수는 없습니다. 자신의 프로그램과 통신하는 것이 좋지만 다른 프로그램은 다른 이스케이프 규칙을 따르기 때문에 조금 이상해집니다.
Michael Kohne

@Michael-물론입니다. 그러나 문제는 너무 전능하여 거의 유혹적인 옵션 일 때 거의 항상 시간을 내야한다는 것입니다. 많은 구형 시스템의 경우 유일한 옵션입니다.
Jon Hopkins

성숙한 라이브러리는 문자로 구분 된 파일을 읽고 쓰는 여러 언어 (확실히 일반적인 라이브러리)로 존재합니다. 그들은 대부분의 상황을 다룰 것입니다. 자신의 CSV 파서를 작성하는 것은 일반적인 종류의 반 패턴으로 보입니다.
quentin-starin

답변:


13

Wikipedia 에 따르면 :

쉼표가 포함 된 필드는 큰 따옴표 문자로 묶어야합니다.

또한 :

큰 따옴표 문자가 포함 된 필드는 큰 따옴표 문자로 묶어야하며, 포함 된 큰 따옴표 문자 각각은 큰 따옴표 문자 쌍으로 표시되어야합니다.

누가 그것을 발명했는지는 모르지만 결국에는 탈출해야 한다는 것을 효과적으로 보여줍니다 . 유일한 솔루션입니다. 다른 모든 것은 덕트 테이프 위에 덕트 테이프 일뿐입니다. 지금은 가능하지만 결국 예외를 제외하고 예외가 필요한 경우에 충돌 할 수 있으며 규칙의 머드 볼보다 오래 걸리지 않습니다. 단순한 탈출 문자 솔루션보다 훨씬 복잡합니다.

CSV 제작자는 따옴표를 사용하여 큰 따옴표로 묶인 특수 구문을 사용하여 쉼표를 이스케이프 처리하지 않으려 고 시도했지만 쉼표를 저장할 수있는 누군가가 큰 따옴표 문자도 저장하고 싶었으므로 그 시점에서 탈출해야했습니다. 이스케이프 문자로 큰 따옴표. 그들이 처음부터 제대로 탈출하기로 결정했다면, 구문은 이제 더 간단 할 것입니다.


3
무엇을해야하고, 무엇을 .. 종종 :) 다르다
팀 포스트

나는 해결책이 꽤 좋다고 생각한다. 간단한 데이터의 경우 CSV가
제대로

1
@Ernelli : 이제 그것에 대해 더 많이 생각하기 때문에 실제로 인간의 가독성과 단순성 사이의 합리적인 타협 일 수 있습니다. 탈출하는 문제 는 컴퓨터 가 파싱 하는 것은 사소한 일이지만 인간에게는 보기 흉한 것입니다 . 따라서 드문 경우에만 이스케이프를 예약하면 ( "큰 따옴표 문자가 포함 된 필드") 일반적으로 사람이 읽을 수있는 출력을 생성합니다 . 필드 이름의 따옴표가 필드 이름의 큰 따옴표보다 더 자주 사용된다는 가정하에 이것은 좋은 솔루션입니다.
Joonas Pulakka

2

나는 당신이 다음과 같은 것을 가지고 있다고 가정합니다 :

Foo,Baz,,,"Foo,Baz"

구분 기호를 포함하는 문자열을 인용하거나 탈출하지 않는 경우에는이없는 실제 파일을 구문 분석의 신뢰할 수있는 방법을.

그러나 데이터를 검사하여 다음과 같은 결론을 구문 분석하고 그릴 수 있습니다.

  • 쉼표로 구분 된 플로트는 문자열로 처리해야합니다.
  • 이 줄 앞뒤의 줄에 구분자가 적 으면이 줄을 구문 분석하지 않고 기록하십시오.
  • '처럼'

그런 것을 처리하기 위해 파서를 작성해야하지만 복잡 할 필요는 없습니다.

내 경험상 Excel과 같은 것에서 대량 덤프를 가져 오면 항상 되돌아 와서 이상한 점을 검토해야합니다. 당신의 도전은 당신의 프로그램을 제공하는 것입니다 단지 가 미친 삽입을하지 않도록 데이터에 대한 충분한 상식. 그런 다음 기록 된 내용을 검토하고 세척 / 헹굼 / 반복하십시오.

한때 모든 우분투 워크 스테이션을 사용하는 소규모 회사의 내부 FAQ를 처리했습니다. FAQ의 일부에 '쉘 단축키'가 주어졌고 파이프가 구분되었습니다. 글쎄, 대답 은 일반적으로 파이프로 구분되어 (즉, grep foo | 무언가) 인용되거나 이스케이프 처리되지 않았습니다. 나는 그 고통을 느낀다 :)


2

한 지점까지 CSV에 문제가 없습니다.

CSV는 형식을 변경할 가능성이 거의없고 수신자 파서에 많은 놀라움을 일으키지 않는 엄격하게 정의 된 데이터에 적합합니다.

다음은 큰 문제에 대한 유용한 목록입니다.

  1. ""에서 ""를 이스케이프 처리 (필드에 필드 구분 기호 포함)
  2. CRLF가 포함 된 ""(필드에 줄 구분 기호 포함)
  3. 유니 코드 (기본 텍스트 형식이 충분하지 않을 수 있음)
  4. OS마다 다른 라인 터미네이터 (CR 또는 CRLF 또는 LF 또는 NUL입니까?)
  5. 인라인 주석 (#, //,-,; 등으로 시작하는 행)
  6. 버전 관리 (파일의 최신 버전에 더 많거나 적은 필드가 포함되어 있음)
  7. NULL과 빈 데이터를 구분하는 것 (, ""은 비어 있지만,는 null입니까?)

필드를 구문 분석하는 방법을 설명하는 메타 데이터 헤더를 사용하여이 방법에 접근 할 수 있지만 XML 만 사용할 수도 있습니다. 이 형식의 자유 형식 CSV 혼란 때문에 발명되었습니다. XML 접근 방식은 단순한 문제 일 수 있기 때문에 너무 무거워 보입니다.

널리 사용되는 대안은 "이상한 문자 구분 기호"전략입니다. 당신이 같은 것을 사용하기 때문에 이것은 위의 탈출 문제를 많이 극복 | 필드 구분을위한 (파이프) 문자 및 레코드 종료를위한 CRLF 필드 카운터를 사용하지 않는 한 여러 줄 필드 문제를 해결하지는 않지만 사람을 위해 멋진 형식의 줄을 얻습니다.

전반적으로, 이런 종류의 파일을 처리하는 간단한 방법을 찾고 있다면 Java 세계에서 OpenCSV 를 던질 수 있습니다. 이렇게하면 모든 문제를 기존 프레임 워크로 추상화 할 수 있습니다.


2

CSV는 많은 상황에서 여전히 유효한 형식입니다. 특히 고객이 응용 프로그램으로 가져와야하는 데이터를 작성하는 가장 쉬운 방법이기 때문입니다. XML을 다루는 것을 선호하는 고객은 거의 없습니다. XML이 매우 장황하고 "무서운"꺾쇠 괄호가 모두 있기 때문일 수 있습니다. 합의 된 캐릭터로 구분 된 간단한 항목 목록으로 두뇌를 감싸는 것은 훨씬 더 간단하며 필드의 내용에 동일한 캐릭터가 허용되지 않는다는 데 동의합니다.

즉, 여전히 입력을 올바르게 처리하고 유효하지 않은 문자를 사용하는 상황을 확인해야합니다. CSV 구문 분석 요구에 FileHelper를 사용하기 시작했습니다.


1

나는 보통 표준을 고수하고 탈출한다. 대부분의 프로그래밍 언어에는 기본 제공 지원 기능이나 사용 가능한 라이브러리가 있습니다.

사용되는 형식에 따라 달라지며 CSV는 간단한 데이터 형식 구조를 교환하기에 적합한 형식입니다.


0

CSV를 잊어 버리려면 JSON을 사용하십시오 . 작성하기 쉽고 구문 분석하기 쉽습니다. XML은 2005 년 이다.


6
JSON 형식 ({또는)과 같은 문자를 사용하려는 경우에도 동일한 문제가 있습니다.
Salandur

Salandur : 전혀 아닙니다! 탈출하는 법에 대한 정확한 규칙이 있습니다! 그러나 {와 내부는 문자열이므로 모호하지 않기 때문에 탈출 할 필요조차 없습니다!
user281377

1
글쎄요, 그러나 "JSON으로 내보내기"기능을 가진 Excel을 기억하지 못합니다.) 좀 더 이해하기 쉬운 형식으로 가져 오기 위해 이상한 것들을 구문 분석해야 할 때가 있습니다.
Tim Post

1
그리고 JSON은 같은 모양의 백만 개의 객체를 전달하는 데 매우 훌륭합니다. 아 잠깐만
Frank Shearar

1
JSON은이 질문과 관련하여 CSV보다 개선 된 기능을 제공하지 않으며 많은 응용 프로그램과의 상호 운용성이 결여되어 있습니다 (앞서 언급했듯이 Office, SQL DB 등에서 가져 오거나 내보낼 수 없음). JSON은 내부의 경량 클라이언트 측 작업에는 적합하지만 XML은 응용 프로그램간에 데이터를 전달하는 데 훨씬 좋습니다.
Dan Diplo

0

일반적으로 내가하는 일은 CSV 파일 대신 TSV (탭으로 구분 된 값)를 가져 와서 파일을 Emacs로 가져 와서 사용하지 않는 몇 가지 드문 문자를 확인하는 것입니다 ($는 일반적으로 여기에서 좋은 선택입니다). 그런 다음 모든 탭을 $로 변환합니다.

거기에서 GNU AWK는 $를 필드 구분자로 사용하고 Bob은 삼촌입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.