CSV(MS-Dos)、CSV(Macintosh)、CSV(逗号分隔)之间有什么区别

CSV(MS-Dos)、CSV(Macintosh)、CSV(逗号分隔)之间有什么区别

excel 2010 中的 CSV(MS-Dos)、CSV(Macintosh)、CSV(逗号分隔)文件类型之间有什么区别?它们都被列为保存文件类型,但最终都是逗号分隔值文件。

答案1

[它们] 之间的区别在于文本字段中是否有某些特殊字符;例如,重音符号(外语)字符。如果导出为 Windows CSV,则这些字段使用 Windows-1252 代码页进行编码。DOS 编码通常使用代码页 437,该代码页映射 Windows 之前的旧 PC 中使用的字符。如果导出为一个,然后使用需要另一个的工具导入,大多数情况看起来都很好,但如果您认识某个名字中有变音符号(或其他外语字符)的人,您将得到意想不到的结果。

来源

答案2

Excel 中的 CSV(MS-Dos)、CSV(Macintosh)、CSV(逗号分隔)文件类型之间有什么区别

使用 Excel 16.8 2023 MS365:

使用file(macOS 12.6 file 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 回车 0x0a 换行

 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 文件。

我怀疑这种输出来自 VB 等 MS 生产力工具中 CSV 文件的脚本生成。

当空时一切都是空

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

(macOS 12.6 stat Brown 等人)

 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

因此我们可以看到前三个字节(字节顺序标记)是好的。并且我们可以看到 UTF-8 编码的 CSV 文件使用 CR LF 终止符,这也不适用于最后一条记录。

最后,关于差异还有更多的地方。如前所述,我想到的是字符编码、实际分隔符、本地化的影响以及与分隔符匹配的值的引用。

我觉得,在十一年后,为那些希望使用“CSV”以编程方式提取人工 CSV 文件进行数据交换的人提供这个警示故事是有用的。我注意到,这个 Stack Exchange 问题缺乏针对这种野心的精确文件格式答案。

相关内容