Истинная разница между Excel CSV и Standard CSV

16

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

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

user157195
источник

Ответы:

19

Это абсолютно зависит от того, что вы определяете как «стандартный» 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"

Не очень сложный. Он вставляет возврат каретки (шестнадцатеричный 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.

slhck
источник
@shhck: почему я вижу реализации парсера csv, разделяющие csv "excel" и "csv"? Я также обнаружил, что Excel является довольно надежной реализацией.
user157195
@ user157195 Зависит от парсера, вы должны прочитать в его документации, почему существует разница между вводом в Excel и не в Excel. Я не понимаю, почему должен быть один. Я знаю это только по R , который относится к Excel CSV так же, как и к любому другому. Однако он также может читать XLS.
slhck
2
Как человек, который годами программно читал сгенерированные в Excel файлы CSV всех форм и размеров, я могу засвидетельствовать, что slhck на 100% правильн - Excel создает 100% «стандартные» файлы CSV. Каждый раз.
Марк Хендерсон
@Farseeker Спасибо за подтверждение! (и у вас сейчас 1337 представителей!)
slhck
5
Внимание! В странах, которые используют ',' в качестве десятичной точки, Excel будет "очень очень умным" и использовать ';' разделитель символа. Это спасает Zee Germanz от просмотра слишком большого количества "цитат"; "в"; "их"; "файлах". К сожалению, если они затем отправят его в офис в Великобритании, он получит AllSmooshedUpIntoASingleCellOnEveryLine. Brilliant.
Люк Ашервуд
-1

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

Эдвин
источник