В чем разница между типами файлов 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 не было точного ответа о формате файла для такой амбиции.