为什么逗号是 CSV 文件中的错误记录分隔符/分隔符?

机器算法验证 项目管理
2022-02-12 23:51:30

我正在阅读这篇文章,我很好奇这个问题的正确答案。

我唯一想到的可能是在某些国家/地区,小数点分隔符是逗号,在CSV中共享数据时可能会出现问题,但我不确定我的答案。

4个回答

CSV 格式规范在RFC 4180中定义。发布此规范是因为

不存在正式的规范,允许对 CSV 文件进行多种解释

不幸的是,自 2005 年(发布 RFC 的日期)以来,一切都没有改变。我们仍然有各种各样的实现。RFC 4180 中定义的一般方法是将包含逗号等字符的字段括在引号中,但是不同的软件并不总是满足此建议。

问题是在各种欧洲语言环境中,逗号字符用作小数点,所以你写0,005而不是0.005. 然而在其他情况下,使用逗号代替空格来表示数字组,例如4,000,000.00(参见此处)。在这两种情况下,使用逗号都可能导致从 csv 文件读取数据时出错,因为您的软件并不真正知道0,005, 0,1是两个数字还是四个不同的数字(请参见此处的示例)。

最后但并非最不重要的一点是,如果您将文本存储在数据文件中,那么逗号在文本中比分号更常见,因此如果您的文本没有用引号括起来,那么这些数据也很容易被错误读取.

没有什么能让逗号更好或更差的字段分隔符,因为CSV 文件是按照 RFC 4180 的建议使用的,以防止上述问题。但是,如果使用不将字段括在引号中的简化 CSV 格式存在风险,或者建议的使用可能不一致,那么其他分隔符(例如分号)似乎是更安全的方法。

从技术上讲,逗号与用作分隔符的任何其他字符一样好。格式的名称直接指的是值以逗号分隔(Comma-Separated Values)。

CSV 格式的描述使用逗号作为分隔符。

任何包含逗号的字段都应该用双引号引起来。所以这不会导致读取数据出现问题。请参阅描述中的第 6 点:

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

例如,函数read.csvwrite.csvfrom R 默认使用逗号作为分隔符。

除了作为数字中的数字分隔符外,它还在许多国家/地区构成地址(例如客户地址等)的一部分。虽然有些国家/地区的地址很短且定义明确,但许多其他国家/地区的地址却很长,包括有时在同一行中的两个逗号。好的 CSV 文件将所有此类数据用双引号括起来。但是过于简单化、写得不好的解析器并没有提供阅读和区分这些内容。(然后,存在使用双引号作为数据的一部分的问题,例如引用一首诗)。

虽然@Tim 的回答是正确的——我想补充一点,“csv”作为一个整体没有共同的标准——尤其是根本没有定义转义规则,导致“格式”在一个程序中可读,但在另一个程序中不可读. 更糟糕的是,阳光下的每个“程序员”都只是想“哦,csv——我将构建自己的解析器!” 然后错过了所有的边缘情况。

此外,csv 完全缺乏存储元数据甚至列的数据类型的能力 - 导致您必须阅读多个文档才能理解数据。