В чем разница между CSV (MS-Dos), CSV (Macintosh), CSV (с запятыми в качестве разделителей)

В чем разница между CSV (MS-Dos), CSV (Macintosh), CSV (с запятыми в качестве разделителей)

В чем разница между типами файлов CSV (MS-Dos), CSV (Macintosh), CSV (разделители-запятые) в Excel 2010? Все они указаны как тип файла сохранения, но в конечном итоге являются файлами значений, разделенных запятыми.

решение1

Разница между [ними] заключается в том, есть ли у вас определенные специальные символы в текстовых полях; например, акцентированный (иностранный) символ. Если вы экспортируете как Windows CSV, эти поля кодируются с использованием кодовой страницы Windows-1252. Кодировка DOS обычно использует кодовую страницу 437, которая сопоставляет символы, используемые на старых ПК до Windows. Если вы экспортируете как один, а затем импортируете с помощью инструмента, который ожидает другой, большинство вещей будут выглядеть нормально, но вы получите неожиданные результаты, если, например, вы знаете кого-то с умлаутом (или другим иностранным символом) в своем имени.

источник

решение2

В чем разница между типами файлов CSV (MS-Dos), CSV (Macintosh), CSV (с разделителями-запятыми) в Excel

Используя Excel 16.8 2023 MS365:

С file(файл macOS 12.6 5.41 Darwin и др.)

file *.csv
MSDOS.csv: CSV text
MAC.csv: ASCII text, with CR line terminators
CSV.csv: CSV text

Примечание: fileдает предположение и может давать различные ответы в зависимости от длины формата CSV.

Наличие байтов возврата каретки (CR) и перевода строки (LR) является существенным отличием формата и гораздо более проясняющим при внутреннем анализе.

0x0d CR 0x0a LF

 for file in *.csv; do echo -n $file" "; xxd $file | tail -2; done
CSV.csv 000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,
MAC.csv 00001260: 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c  .,,,.,,,.,,,.,,,
00001270: 0d2c 2c2c                                .,,,
MSDOS.csv 000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,

0x2c — разделитель в CSV выше. Важно отметить, что последняя строка НЕ ​​получает терминал 0x0D 0x0A (CSV), 0x0d (MAC) или 0x0D 0x0A (MSDOS). Это может стать сюрпризом, поскольку я был свидетелем того, как Excel добавлял дополнительный завершающий 0x0D 0x0A, который мог нарушить логику обработки, если CR и/или LF указывают, что он используется кодом для продолжения анализа.

00000530: 2c-- --34 3045 4330 30-- ---- --2c 3138  ,--40EC00----,18
00000540: 390d 0a                                  9..

Примечание: «--» — это отредактированный текст, поскольку он взят из настоящего файла Excel.

Я подозреваю, что такой вывод получается в результате скриптовой генерации CSV-файлов в инструментах повышения производительности Microsoft, таких как VB.

Когда пусто, все пусты.

stat -f "%z %N" *EMPTY.csv   
0 CSV_EMPTY.csv
0 MAC_EMPTY.csv
0 MSDOS_EMPTY.csv

(macOS 12.6, статистика Брауна и др.)

 for file in *.csv; do echo $file" "; xxd $file | tail -2; done
CSV.csv 
000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,
MAC.csv
00001260: 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c  .,,,.,,,.,,,.,,,
00001270: 0d2c 2c2c                                .,,,
MSDOS.csv
000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,

Ответ на этот вопрос на Stack Exchange дан в другом месте — о различиях в кодировках символов.

Но Excel предоставляет четвертый метод сохранения «CSV», который приводит нас к «CSV UTF-8».

file UTF8_EMPTY.csv 
UTF8_EMPTY.csv: Unicode text, UTF-8 text, with no line terminators
file UTF8.csv      
UTF8.csv: Unicode text, UTF-8 (with BOM) text, with CRLF line terminators

Здесь fileгораздо более подробно и конкретно. Байты файла выглядят так:

xxd UTF8_EMPTY.csv 
00000000: efbb bf                                  ...
xxd UTF8.csv      
00000000: efbb bf31 2c32 2c33 0d0a 342c 352c 36    ...1,2,3..4,5,6

Итак, мы видим, что первые три байта (маркер порядка байтов) верны. И мы видим, что CSV-файлы в кодировке UTF-8 используют завершение CR LF, которое также не применяется к последней записи.

Наконец, есть еще места, куда можно обратиться относительно различий. Как уже отмечалось, на ум приходят кодировка символов, фактические разделители и то, как на них влияет локализация и кавычки значений, соответствующих разделителю.

Я счел полезным одиннадцать лет спустя предоставить эту предостерегающую историю тем, кто надеется использовать 'CSV' для программного приема созданных человеком CSV-файлов для обмена данными. Я заметил, что в этом вопросе Stack Exchange не было точного ответа о формате файла для такой амбиции.

Связанный контент