14

В чем истинная разница между Excel CSV и стандартным CSV?

Например, при обработке столбцов с разрывами строк внутри одной ячейки, как они по-разному кодируют ее?

2 ответа2

18

Это абсолютно зависит от того, что вы определяете как "стандартный" CSV. Насколько мне известно, Excel следует правилам, изложенным в RFC 4180, «Общий формат и MIME-тип для файлов CSV».

Рассмотрим таблицу, в которой первая ячейка в первой строке имеет два переноса строк. В Excel это будет выглядеть следующим образом:

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | col1, line1a  |            |            |
|   | col1, line1b  |            |            |
|   | col1, line1c  | col2, row1 | col3, row1 |
| 2 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Теперь, как Excel экспортирует это? Давайте посмотрим - текстовый редактор будет отображать это:

"col1, line1a
col1, line1b
col1, line1c","col2, row1","col3, row1"
"col1, row2","col2, row2","col3, row2"

Не очень сложно. Он вставляет возврат каретки (hex 0D), где разрыв строки был в нашей ячейке. Каждая клетка окружена двойными кавычками. Кроме того, фактические строки разделяются символом возврата каретки.

Чтобы разобрать это правильно, парсер CSV должен

  • игнорировать возврат каретки, когда он появляется в двойных кавычках (то есть в ячейке)
  • не игнорировать возврат каретки, когда он появляется за пределами двойных кавычек

Если этого не произойдет, вы получите что-то искаженное - обратите внимание, что теперь есть четыре строки вместо двух, потому что не удалось игнорировать разрывы строк.

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | "col1, line1a |            |            |
| 2 | col1, line1b  |            |            |
| 3 | col1, line1c" | col2, row1 | col3, row1 |
| 4 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Но давайте посмотрим, что говорит RFC, может быть, Excel сделал все правильно?

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

Аккуратно, это именно то, что сделал Excel. Подводя итог, можно сказать, что Excel следует рекомендациям "стандартного" CSV-файла. При наличии правильного синтаксического анализатора CSV он также должен иметь возможность читать файлы Excel CSV.

-1

Из первоначальной реализации CSV я понял, что все текстовые поля заключены в кавычки, а цифры не должны быть. Excel не делает этого, и если вы попытаетесь загрузить сгенерированные в Excel файлы csv на платформы, не принадлежащие Microsoft, они потерпят неудачу. Это стандартный подход Microsoft, игнорирующий взаимодействие и сосредоточенный на слепом следовании правилам. То же самое произошло с IE, они правильно следовали правилам html/css для атрибутов padding и margin и игнорировали тот факт, что каждая существующая веб-страница и веб-браузер обрабатывали их по-разному. В результате почти каждая веб-страница теперь имеет специальные правила для IE. Я считаю, что CSV-файлы, созданные Excel, бесполезны, и использую столбец "сцепленных" функций, чтобы вручную создавать их самостоятельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .