서식을 손상시키지 않고 CSV 열에 쉼표를 포함시키는 방법이 있습니까?


283

이름과 숫자가있는 두 개의 열 CSV가 있습니다. 예를 들어 일부 사람들의 이름은 쉼표를 사용합니다. Joe Blow, CFA.이 쉼표는 새 열로 해석되므로 CSV 형식을 구분합니다.

읽었으며 가장 일반적인 처방전은 해당 문자를 바꾸거나 구분 기호를 새로운 값으로 바꾸는 것 같습니다 (예 :) this|that|the, other.

쉼표 구분 기호를 유지하고 싶습니다 (excel은 다른 구분 기호를 지원하지만 다른 인터프리터는 지원하지 않을 수 있음을 알고 있습니다). 나는 또한 Joe Blow| CFA어리석은 것처럼 쉼표를 이름으로 유지하고 싶습니다 .

이스케이프 처리 등의 형식을 손상시키지 않고 CSV 열에 쉼표를 포함시키는 방법이 있습니까?



나를 위해 일한 작은 해킹 : 텍스트 편집기에서 csv 파일을 연 다음 Excel 문서에 붙여 넣습니다. 큰 덩어리로 이것을 할 수 있다면 효과가 있습니다.
Jonas

@Jonas : Excel은 동일한 토큰이 구분 기호 또는 데이터의 일부로 사용되는지 여부를 추측 할 수 없습니다. 텍스트 편집기에서 붙여 넣기해도 변경되지 않습니다.
IInspectable

답변:


371

필드를 따옴표로 묶습니다 (예 :

field1_value,field2_value,"field 3,value",field4, etc...

Wikipedia를 참조하십시오 .

업데이트 :

따옴표를 인코딩하려면을 사용하십시오 ". 필드에 하나의 큰 따옴표가로 인코딩되고 ""전체 필드가됩니다 """". 예를 들어 Excel에서 다음을 보면 :

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

CSV 파일에는 다음이 포함됩니다.

regular_value,",,,""",","""",","""""""",""""

쉼표는 따옴표를 사용하여 간단히 캡슐화되므로 ,됩니다 ",".

쉼표와 인용의 요구가 캡슐화하고 인용하는, 그래서 ","된다 """,""".


4
이것은 나를 위해 일했다! js 변수를 CSV로 내보내고 모든 문자열 주위에 따옴표를 추가하면 질문에서 언급 한 것처럼 "John Blow, CFA"문제를 해결하는 데 도움이되었습니다.
Madhulika Mukherjee

각 셀 안에 따옴표와 쉼표가 모두 있으면 어떻게됩니까?
speedplane

2
짧은 쉼표는 인용 부호 (예 : 캡슐화된다 - 나는 몇 가지 예와 답을 갱신 ","(예를 들어), 따옴표는 이스케이프 """)
라이언

6
이제 99 %의 사용 사례를 해결할 수있는 훌륭한 솔루션을 제안하기 때문에이 답변이 인정되어야합니다.
BuZz

따옴표로 이스케이프 된 필드로 CSV 파일을 구문 분석하는 C # 라이브러리가 있습니까?
Minh Tran

34

CSV 형식의 문제점은 사양이 하나도없고 몇 가지 허용되는 방법이 있으며 어떤 방법을 사용해야하는지 구별 할 수있는 방법이 없습니다 (생성 / 해석에 사용). 다른 게시물 에서 문자 (이 경우 줄 바꿈이지만 동일한 기본 전제)를 이스케이프 처리하는 모든 방법에 대해 논의 했습니다 . 기본적으로 의도 된 사용자를 위해 CSV 생성 / 탈출 프로세스를 사용하고 나머지는 신경 쓰지 않기를 바랍니다.

참조 사양 문서 .


10
RFC 4180, CSV (Comma-Separated Values) 파일의 공통 형식 및 MIME 유형, ietf.org/rfc/rfc4180.txt ; 하나의 '공식'사양.
Shi

3
가장 널리 수용되는 접근 방식을 포함하면 이것이 큰 해답이 될 것입니다. 그대로, @Ryan의 대답이 이깁니다.
rinogo

16

당신이 말한 것을 원한다면 인용 부호를 사용할 수 있습니다. 이 같은

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

이제 이름 변수에 쉼표를 사용할 수 있습니다.


귀하의 팁에 감사드립니다. 클라우드 : $whatever = "\"".$name."\"";
washere

솔루션 주셔서 감사합니다.
Bhavin Thummar

10

그 값을 인용해야합니다. 더 자세한 사양은
다음과 같습니다 .


2
여러 사양이 있으며 Excel은 항목 주위에 따옴표를 사용하고 Linux는 백 슬래시 문자를 사용합니다. 불행히도, 당신은 의도 한 청중 / 목표 시스템을 탈출해야합니다.
Rudu

7

다른 답변의 요점 외에도 Excel에서 따옴표를 사용하는 경우 유의해야 할 것은 공백 배치입니다. 다음과 같은 코드 줄이 있다면 :

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel은 쉼표를 이스케이프 처리하는 대신 초기 따옴표를 리터럴 따옴표로 취급합니다. 코드를로 변경해야합니다

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

나를 여기로 데려 간 것은이 미묘한 일이었습니다.


3

나는 똑같은 문제에 직면했고 인용 ,해도 도움이되지 않았다. 결국, I는를 대체 ,하여 +, 처리를 완료 OUTFILE로 출력을 저장하고 교체 +,. 이것은 추한 것처럼 보이지만 그것은 나를 위해 일했습니다.


2
데이터에 "+"문자가 포함되어 있으면 어떻게했을까요?
앤드류 모튼

1
@AndrewMorton 예, 그것은 도전입니다. 그러나 제 경우에는 +데이터에 전혀 존재하지 않는다고 확신 합니다. 친절한 의견 감사합니다.
Mohammed

4
간단하고 강력한 방법은 문자열을 큰 따옴표로 묶고 큰 따옴표를 두 개를 사용하여 문자열 내에서 이스케이프 처리하는 것 ""입니다. 이것이 정상적인 방법입니다.
Andrew Morton

1
작동하지 않는 경우 구분되는 쉼표와 함께 공백을 생성하지 않는지 확인하십시오. "개구리", "노란색, 녹색"이 작동합니다. "개구리", "노란색, 녹색"이 작동하지 않음
Dazbert

개인적으로 @AndrewMorton의 두 번째 의견은 실제로 허용 된 답변보다 나은 것이 무엇인지 이해하는 데 실제로 도움이되었습니다. 1 단계-데이터 필드에서 큰 따옴표를 피하십시오 (예 : Python) : field = field.replace('"', '""')2 단계-1 단계 후 필드 자체를 큰 따옴표로 묶으십시오 field = '"' + field + '"'.
윌 Croxford

3

언어에 따라 사용 가능한 to_json 메소드가있을 수 있습니다. 그것은 CSV를 깨뜨리는 많은 것들을 피할 것입니다.


3

Mac의 Numbers와 같은 일부 응용 프로그램은 앞에 공백이 있으면 큰 따옴표를 무시합니다.

a, "b,c"작동하는 동안 a,"b,c"작동 하지 않습니다 .


1
아마 한 시간의 시간을 절약했을 것입니다. 감사합니다!
Shaun314

1

예를 들어 PHP base64_encode ($ str) / base64_decode ($ str)에서 값을 인코딩 할 수 있습니다.

IMO는 따옴표 등을 두 배로 늘리는 것보다 간단합니다.

https://www.php.net/manual/en/function.base64-encode.php

인코딩 된 값에는 쉼표가 포함되지 않으므로 CSV의 모든 쉼표는 구분 기호가됩니다.



0

Text_Qualifier플랫 파일 연결 관리자 의 필드를로 사용할 수 있습니다 ". 이것은 데이터를 따옴표로 묶어야 하며 따옴표 밖에있는 쉼표로만 구분해야합니다.


0

먼저 항목 값에 큰 따옴표 ( ")가 있으면 2 개의 큰 따옴표 (" ")로 바꾸십시오.

item = item.ToString().Replace("""", """""")

마지막으로, 항목 값 랩 :

왼쪽 : 큰 따옴표 문자 ( ")

오른쪽에 : 큰 따옴표 문자 ( ") 및 쉼표 문자 (,)

csv += """" & item.ToString() & ""","

0

큰 따옴표는 나를 위해 일하지 않았다, 그것은 나를 위해 일했다 \". 예를 들어 큰 따옴표를 배치하려면을 설정할 수 있습니다 \"\".

예를 들어 공식을 작성할 수 있습니다.

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

CSV로 작성합니다 :

= IF (C3 = 1, "", B3)


0

여기에 필요한 것은 아니지만 매우 오래된 질문이며 그 대답은 다른 사람들에게 도움이 될 수 있습니다. 다른 구분 기호를 사용하여 Excel로 가져 오는 데 유용한 팁은 텍스트 편집기에서 파일을 열고 첫 번째 줄을 추가하는 것입니다.

sep = |

어디 | Excel에서 사용할 구분 기호입니다. 또는 Windows에서 기본 구분 기호를 약간 길게 변경할 수 있습니다.

제어판> 시계 및 지역> 지역> 형식> 추가> 번호> 목록 구분 기호 [쉼표에서 선호하는 대안으로 변경]. 즉, Excel은 기본적으로 선택한 구분 기호를 사용하여 CSV를 내보내는 것을 의미합니다.

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