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

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

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

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

答案1

这完全取决于你如何定义“标准” 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 |
+---+---------------+------------+------------+

现在,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 文件。

答案2

我对原始 csv 实现的理解是,所有文本字段都用引号括起来,而数字则不需要。Excel 不会这样做,如果您尝试在非 Microsoft 平台上上传 Excel 生成的 csv 文件,则会失败。这是 Microsoft 的标准方法,忽略互操作性并专注于盲目遵循规则。IE 也发生了类似的事情,他们正确地遵循了 padding 和 margin 属性的 html/css 规则,而忽略了每个现有网页和 Web 浏览器对它们的不同处理这一事实。结果,现在几乎每个网页都有针对 IE 的特殊规则。我发现 excel 生成的 csv 文件毫无用处,并使用一列“连接”函数自己手动正确创建它们。

相关内容