Правильно уникнути подвійної цитати в CSV


164

У мене в CSV такий рядок:

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

Цитата поруч із 24використовується для вираження дюймів, тоді як цитата безпосередньо біля цієї цитати закриває поле. Я читаю рядок за допомогою, fgetcsvале аналізатор робить помилку і читає значення як:

Samsung U600 24",10000003409"

Я спробував поставити звороту косу рису перед цитатою дюймів, але потім я просто отримав зворотний нахил у назві:

Samsung U600 24\"

Чи є спосіб уникнути цього в CSV, щоб це значення було Samsung U600 24", чи я повинен переробити це в процесорі?


21
Просто подвоїть свою цитату. Ось і все
Ваше здорове почуття

Відповіді:


281

Використовуйте 2 цитати:

"Samsung U600 24"""

102
Пункт RFC-4180, "Якщо для укладання полів використовуються подвійні лапки, то слід уникнути подвійної лапки, яка з'являється всередині поля, передуючи їй ще однією подвійною цитатою".
приурочений

4
Як зазначає tommed, вам потрібно додати лише одну подвійну цитату, щоб уникнути подвійної цитати. Ви можете використовувати інструмент командного рядка під назвою csvfix для виявлення будь-яких рядків, які не відповідають: csvfix check -nl -v [ім'я файлу]
Сем Крічлі

2
@SamCritchley Я бачу лише одну подвійну цитату, яка використовується тут для втечі. Під "Використовувати 2 лапки", user4035 означає, що 1 цитата повинна бути замінена на 2 лапки. Уникаючи подвійних лапок з подвійними лапками, ви ефективно створюєте пари подвійних лапок (2 подвійних лапки). Кінцева цитата, яку ви бачите в кінці, - це скасувати поле.
Zenexer

1
Одиничні подвійні подвійні подвійні цитати не потрібні, але лише в тому випадку, якщо випливає двозначна подвійна котирування ... найкраще!
Даніель Уолтріп

14

Не тільки подвійні лапки, ви будете мати потребу в одинарній цитаті ( '), подвійній цитаті ( "), зворотній косої риси ( \) та NUL (байт NULL).

Використовуйте fputcsv()для написання та fgetcsv()для читання, яке подбає про всіх.


3
Цей коментар на сторінці документаціїfputcsv() показує, як ви могли використовувати, fputcsv()коли ви хочете виводити у форматі csv до браузера замість фактичного файлу.
dennisschagt

15
@Angelin Nadar, чи не могли б ви додати джерело до вашої заяви про необхідність подвоїти одиничну цитату, зворотну косу рису та NUL? Я не знайшов його в RFC-4180 .
Петро 'PePa' Павло

2
Вам не потрібно насправді уникати одинарних лапок тощо. Належний файл CSV навіть не потребує додавання подвійних лапок навколо поля, яке містить лише одиничні лапки. Якщо програма зчитування CSV належним чином реалізована, він повинен прочитати файл правильно навіть із цими символами.
xji

4
Чому за цю відповідь коли-небудь проголосували? Коментар про втечу персонажів ніколи не було підкріплено, і оригінальне питання не задається питанням PHP. Це, мабуть, справедливо для розділювача рядків (і лише для вибраного роздільника), коли програма, наприклад Open Office, дозволяє змінити його.
Дейв Ф

0

Я знаю, що це стара публікація, але ось як я її вирішив (разом із перетворенням нульових значень у порожній рядок) у C # за допомогою методу розширення.

Створіть статичний клас із таким, як:

    /// <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() );

-1

Якщо значення містить кому, символ нового рядка або подвійну лапки, то рядок повинен бути укладений у подвійні лапки. Наприклад: "Значок нового рядка в цьому полі \ n".

Ви можете скористатися інструментом нижче, щоб вийти з операторів "" та. https://www.freeformatter.com/csv-escape.html#ad-output

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.