Правильно избегать двойных кавычек в 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, параграф «Если для заключения полей используются двойные кавычки, то двойная кавычка, появляющаяся внутри поля, должна быть экранирована, предшествуя другой двойной кавычке».
Том

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

2
@SamCritchley Я вижу только одну двойную кавычку, чтобы убежать сюда. «Использовать 2 кавычки» user4035 означает, что 1 кавычка должна быть заменена на 2 кавычки. Избегая двойных кавычек с двойными кавычками, вы фактически создаете пары двойных кавычек (2 двойных кавычки). Последняя цитата, которую вы видите в конце, должна завершить поле.
Zenexer

1
одинарные двойные двойные одинарные двойные кавычки требуются, но только если они сопровождаются двойными одинарными двойными кавычками ... удачи!
Даниэль Уолтрип

14

Не только двойные кавычки, вам понадобятся одинарные кавычки ( '), двойные кавычки ( "), обратный слеш ( \) и NUL (байт NULL).

Используйте, fputcsv()чтобы писать и fgetcsv()читать, что обо всем позаботится.


3
Этот комментарий на странице документацииfputcsv() показывает, как вы можете использовать, fputcsv()когда вы хотите выводить в формате CSV в браузер вместо реального файла.
Денисшагт

15
@ Ангелин Надар, не могли бы вы добавить источник к вашему заявлению о необходимости двойных одинарных кавычек, обратной косой черты и 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.