CSV에서 큰 따옴표를 올바르게 이스케이프 처리


164

CSV에 다음과 같은 줄이 있습니다.

"Samsung U600 24"","10000003409","1","10000003427"

옆에 24있는 인용 부호는 인치를 표시하는 데 사용되며 해당 인용 부호 바로 옆의 인용 부호는 필드를 닫습니다. 나는 줄을 읽고 fgetcsv있지만 파서는 실수를하고 값을 다음과 같이 읽습니다.

Samsung U600 24",10000003409"

인치 따옴표 앞에 백 슬래시를 넣으려고했지만 이름에 백 슬래시가 나타납니다.

Samsung U600 24\"

CSV에서 올바르게 이스케이프 처리하는 방법이 있습니까? 값이 Samsung U600 24"이거나 프로세서에서 정규 표현식을 사용해야 합니까?


21
견적을 두 배로 늘리십시오. 그게 다야
당신의 상식

답변:


282

2 인용 부호를 사용하십시오 :

"Samsung U600 24"""

102
RFC-4180, 단락 "큰 따옴표를 사용하여 필드를 묶는 경우 다른 큰 따옴표를 앞에 두어 필드 안에 나타나는 큰 따옴표를 이스케이프해야합니다."
tommed

4
tommed에 따르면 큰 따옴표를 이스케이프하려면 작은 따옴표 만 추가하면됩니다. 당신은 준수하지 않는 모든 줄을 감지 csvfix라는 명령 줄 도구를 사용할 수 있습니다 csvfix 체크 -nl -v [파일 이름]
샘 Critchley

2
@ SamCritchley 여기서는 큰 따옴표 만 사용됩니다. "2 인용 부호 사용"에 의해 user4035는 1 인용 부호가 2 인용 부호로 대체되어야 함을 의미합니다. 큰 따옴표로 큰 따옴표를 이스케이프하면 큰 따옴표 쌍 (2 개의 큰 따옴표)을 효과적으로 만들 수 있습니다. 마지막에 따옴표는 필드를 종료하는 것입니다.
Zenexer

1
단일 이중 이중 작은 따옴표가 필요하지만 이중 단일 큰 따옴표로 진행되는 경우에만 ... 행운을 빕니다!
Daniel Waltrip

14

큰 따옴표뿐만 아니라 작은 따옴표 ( '), 큰 따옴표 ( "), 백 슬래시 ( \) 및 NUL (NULL 바이트)이 필요합니다.

모든 것을 다룰 수 있도록 읽고 fputcsv()쓰는 데 사용하십시오 fgetcsv().


3
이 코멘트의 문서 페이지fputcsv() 당신이 사용할 수있는 방법을 보여줍니다 fputcsv()브라우저 대신 실제 파일을 CSV 형식으로 출력 할 때.
dennisschagt

15
@Angelin Nadar, 작은 따옴표, 백 슬래시 및 NUL이 필요하다는 주장에 소스를 추가 할 수 있습니까? RFC-4180 에서 찾지 못했습니다 .
Petr 'PePa'Pavel

2
작은 따옴표 등을 실제로 이스케이프 할 필요는 없습니다. 적절한 CSV 파일은 작은 따옴표 만 포함 된 필드 주위에 큰 따옴표를 추가 할 필요도 없습니다. CSV 리더가 올바르게 구현 된 경우 해당 기호를 사용하여 파일을 올바르게 읽어야합니다.
xji

4
이 답변이 투표 된 이유는 무엇입니까? 이스케이프 문자에 대한 의견은 백업되지 않았으며 원래 질문은 PHP에 대해 묻지 않습니다. Open Office와 같은 프로그램에서 변경할 수있는 경우 문자열 구분 기호 (및 선택한 구분 기호에만 해당)에만 해당됩니다.
Dave F

0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 확장 방법을 사용하여 C #에서 null 값을 빈 문자열로 변환하는 것과 함께 해결하는 방법입니다.

다음과 같은 정적 클래스를 작성하십시오.

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

그런 다음 각 문자열에 대해 CSV 대신 다음을 작성하십시오.

stringBuilder.Append( WhateverVariable );

당신은 단지 :

stringBuilder.Append( WhateverVariable.Q() );

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