Excel CSV 和标准 CSV 之间的真正区别

use*_*195 16 file-format csv microsoft-excel

Excel CSV 和标准 CSV 之间的真正区别是什么?

例如,在处理一个单元格内带有换行符的列时,它们如何对其进行不同的编码?

slh*_*hck 20

这绝对取决于您定义的“标准”CSV。就我而言,Excel 遵循RFC 4180 中概述的规则,即“CSV 文件的通用格式和 MIME 类型”。

考虑一个表格,其中第一行的第一个单元格有两个换行符。在 Excel 中,它将如下所示:

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | col1, line1a  |            |            |
|   | col1, line1b  |            |            |
|   | col1, line1c  | col2, row1 | col3, row1 |
| 2 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

现在,Excel 将如何导出它?让我们看看——一个文本编辑器会显示这个:

"col1, line1a
col1, line1b
col1, line1c","col2, row1","col3, row1"
"col1, row2","col2, row2","col3, row2"
Run Code Online (Sandbox Code Playgroud)

不是很复杂。它0D在我们的单元格中的换行符处插入一个回车符 (hex )。每个单元格都被双引号包围。此外,实际行用回车分隔。

为了正确解析这个,CSV解析器需要

  • 当它出现在双引号内时忽略回车(即单元格)
  • 当它出现在双引号之外时不要忽略回车

如果它不这样做,你最终会得到这样的乱码——注意,现在有四行而不是两行,因为它没有忽略换行符。

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | "col1, line1a |            |            |
| 2 | col1, line1b  |            |            |
| 3 | col1, line1c" | col2, row1 | col3, row1 |
| 4 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+
Run Code Online (Sandbox Code Playgroud)

但是,让我们看看 RFC 怎么说,也许 Excel 做对了?

包含换行符 (CRLF)、双引号和逗号的字段应该用双引号括起来。

很好,这正是 Excel 所做的。总而言之,Excel 似乎遵循“标准”CSV 文件的建议。给定一个合适的 CSV 解析器,它也应该能够读取 Excel CSV 文件。

  • 警告!在使用 ',' 作为小数点的国家/地区,Excel 将“非常非常聪明”并使用 ';' 分隔符。这使 Zee Germanz 免于看到太多“引用”;“in”;“他们的”;“文件”。不幸的是,如果他们随后将其发送到英国办事处,它将获得 AllSmooshedUpIntoASingleCellOnEveryLine。杰出的。 (5认同)
  • 作为多年来一直以编程方式阅读各种形状和大小的 excel 生成的 CSV 文件的人,我可以证明 slhck 是 100% 正确的——Excel 生成 100% 的“标准”CSV 文件。每一次。 (2认同)