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.