Спецификация CSV - двойные кавычки в начале и конце полей - PullRequest
0 голосов
/ 27 июня 2018

Вопрос (потому что я не могу разобраться), должно ли ""hello world"" быть допустимым значением поля в CSV-файле в соответствии со спецификацией?

т.е. следует:

1,""hello world"",9.5

быть действительной записью CSV?

(Если это так, то парсер Perl CSV-XS, который я использую, слегка сломан, но если нет, то $line =~ s/\342\200\234/""/g; - действительно плохая идея;))

Странно то, что этот код работал без проблем в течение многих лет, но мы только что нашли запись, которая начиналась с левой двойной кавычки и не содержала запятой (выше приведен от предварительного синтаксического анализатора CSV ).

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Каноническое определение формата CSV: https://www.rfc -editor.org / rfc / rfc4180.txt . Там написано:

  1. Каждое поле может быть или не быть заключено в двойные кавычки (однако некоторые программы, такие как Microsoft Excel, не используют двойные кавычки совсем). Если поля не заключены в двойные кавычки, то двойные кавычки могут не появляться внутри полей. Например:

    "aaa", "bbb", "ccc" CRLF
    ZZZ, ууу, ххх

  2. Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые должны быть заключены в двойные кавычки. Например:

    "ааа", "б КРЛФ
    bb "," ccc "CRLF
    ZZZ, ууу, ххх

  3. Если для заключения полей используются двойные кавычки, то двойные кавычки появляться внутри поля необходимо экранировать, предшествуя ему еще одна двойная цитата. Например:

    "ааа", "б", "бб", "ссс"

Последнее правило означает, что ваша строка должна быть:

1,"""hello world""",9.5

Но не все парсеры / генераторы точно следуют этому стандарту, поэтому вам может понадобиться из-за функциональной совместимости ослабить некоторые правила. Все зависит от того, насколько вы контролируете запись в формате CSV и синтаксический анализ формата CSV.

0 голосов
/ 27 июня 2018

Это зависит от используемого вами escape-символа. Если ваш escape-символ '"' (двойная кавычка), тогда ваша строка должна выглядеть как

1,"""hello world""",9.5

Если ваш escape-символ '\' (обратная косая черта), тогда ваша строка должна выглядеть как

1,"\"hello world\"",9.5

Проверьте настройки парсера / окружения по умолчанию или явно настройте парсер с нужным вам escape-символом, например. чтобы использовать обратную косую черту, выполните:

my $csv = Text::CSV_XS->new ({ quote_char => '"', escape_char => "\\" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...