CSV是XML和JSON的良好替代方案吗?[关闭]


22

CSV是否被视为针对XMLJSON的编程语言的不错选择?

我通常使用XML和JSON(有时是纯文本文件)作为平面文件存储。但是,最近我在PHP中遇到了CSV实现。虽然我通常看到CSV用于Excel文件中的输入,但是我从未在编程中使用它。它在任何方面都比XML或JSON更好吗?


3
这个问题是含糊的。您是在问CSV是否可以作为一种更好的存储系统格式,还是在问是否有任何理由在XML / JSON上使用CSV?
GrandmasterB 2014年

4
任何CSV消息结构都可以映射为XML或JSON消息格式。并非所有XML / JSON消息格式都可以映射到CSV。因此,CSV仅涵盖特定的数据用例,即表格格式,而JSON和XML可以涵盖更复杂的消息结构。
乔恩·雷诺2014年

@JonRaynor:我认为可以将任何XML或JSON格式映射到CSV,但不是干净的。您必须发明一些表示树结构的方法。结果将是丑陋的,几乎肯定不值得实施。对于几乎所有实际目的,您都是对的。
Keith Thompson 2014年

@KeithThompson 它是被发明的:)
Eliran Malka

Answers:


41

答案是,这取决于。

CSV非常适合某些用例。例如,作为大型数据集的“流”格式,流比XML / JSON更容易,并且CSV文件占用的存储空间少得多。我用它来传输千兆字节范围内的数据集,而其他格式则不可行。

在处理遗留系统和工作流时,在某些行业中也确实很常见。尝试将JSON导入MS Excel。

ODI最近对CSV进行了评论,称2014 年为“ CSV年”

对于“适当的” CSV格式,请考虑在HTTP响应中使用CSV MIME类型


2
遗留系统+1;尽管旧版系统可能未按预期方式使用CSV(最近我不得不处理导入的CSV,老实说,这是报告,而不是表格),但我们确实必须处理全世界的旧版信息。
Brian S

1
CSV具有很大的流传输优势:与JSON或XML解析器相比,CSV解析器具有更少的状态要处理。
马特

22

最肯定不是。

CSV是一种表格格式,可以很好地映射到数据集或其他表格数据。但是,并非所有数据都是表格格式的!通常,我们要序列化对象图。在以下情况下,这可能很困难:

  • 循环参考
  • 共享子图(例如,两个对象都包含与成员相同的对象)
  • 不同类型的对象要序列化到同一文档

我们还希望能够从存储格式中可靠地反序列化对象。

XML格式

主要是一种可扩展的标记语言。它也可以用来存储常规数据结构。对ID的语言支持意味着可以创建复杂的图形,尽管最适合用于树。可以根据规范对文档进行正确性测试。这种格式存在很多问题,可能会使其变得不切实际,例如极端冗长。

JSON格式

主要是一种存储简单对象树的方法。不支持常规图。JSON 除了基本类型stringintegerfloatbooleannull和集合类型arrayobject之外,没有其他类型的概念。

YAML

最容易理解为JSON的扩展。具有别名的概念,可以创建任意复杂度的对象图。具有元数据(如标签)的概念,可用于正确键入。

CSV

除了一个表外什么都没有。如果要存储对象图,则必须使用类似

#ID,Type,Field1,Field2,...,FieldN

1,String,foo
2,String,bar
3,Array<String>,1,2

CSV的许多方言在定界符,行终止符,引号,转义符以及许多其他问题上都存在分歧,这些问题使其不适用于常规(二进制)数据。所有这些使处理CSV数据变得相当困难。

因此,将CSV用作常规序列化格式时,从根本上讲,简单的事情很难或不可能实现。

当使用它存储真正的表格数据(如时间表或一系列测量值)时,此批评并不适用。在此,CSV(通常是制表符分隔值的变体)通常比其他数据格式更紧凑,更易于使用。


1
我认为这是一个公平的论点。它们是不同的,因此将它们用于不同的事物,并在最好的地方使用它们。
2014年

1
没有第一行,这将是一个很好的答案。CSV是用于表格信息的XML的很好替代(可分发的SQLite文件可能比这两者都更好)。但是,正如您为表格数据所解释的那样,它是绝佳的文件选择。

4

我还不得不说,这取决于您要实现的目标。对于许多问题,如果问题足够小并且您的选择与现有系统完全吻合,那么选择什么都无关紧要。

由于您引入了更多的复杂性并需要调试新的输入系统,因此采用旧系统并尝试采用新格式有时可能会遇到问题。当新人们更喜欢不同于现有内容的东西,或者出现一种新格式并且他们想尝试它时,我已经看到了很多。这可能不是一个好主意,这取决于具体情况。

几年前,我致力于研究图形数据库系统,该系统依赖于各种格式的CSV文件。CSV文件导入器将为我们构建图形,并且它已经完成了多年的调试和优化代码工作。它既快速又灵活,我们很乐意使用它引导大型研究项目。当XML出现在场景中时,我们添加了XML导入器,但这并不一定在速度或表示复杂性方面有所改进,并且在表示图结构方面,XML肯定没有比CSV更好。JSON比XML更好(更短),但在很多方面都相似,因此在该系统上创建新的导入程序时,我期望得到类似的结果。

在某个时间点,我们有一个客户以“ cobol”格式引入了大量数据,这些文件的行长可变,其中包含指示如何解释该行之后的字节的标记。它源于存储昂贵的时代,因此要求紧凑。我们通过即时将数据转换为CSV格式并将其馈入CSV导入器来导入数据。这很容易做到,并且减少了调试和维护的数量,这是一件好事。如果我们必须一直导入此类数据,则可能直接将其内置到系统中以获得性能和效率提高。

因此,这取决于您在做什么以及底层系统在做什么。在我的示例中,CSV导入器经过了精心设计和可靠的设计。我会毫不犹豫地告诉您,在不了解我要构建的其他层中正在发生什么的情况下,一种格式的好坏。我喜欢JSON并且比较喜欢它,但是我知道,鉴于某些复杂的数据结构和足够大的数据集,CSV文件也可以很好地工作。


3

没有。

CSV并不是真正的单一格式。野外的许多CSV文件都有多种样式用于转义,分隔符和其他格式问题。

如果您打算将其用作平面文件存储,那么使用JSON将为您提供更好的服务。JSON映射到对象或从对象映射出的麻烦要比将CSV粘贴的麻烦少得多。


0

我强烈建议不要这样做。我可能会在某个时候输出CSV(如果用户要求的话)。但这不适合用于存储/导入目的。这主要是由于“ CSV”定义不明确。“ C”表示“逗号”或“字符”是否分开?您如何处理包含转义字符(如“?”)的文本字符串,每个该死的CSV实现均以不同方式对待转义字符等,从而导致可以导出但不能导入的文件等。

Excel是一个很好的演示:在英语版本中,它使用“,”作为分隔符。在德国,它使用“;”。因此,德语版本会扼杀英语CSV文件,反之亦然...

它的主要优点是可读性强,不容小discount。但是我不会将其作为存储格式,因为它太脆弱了。如果必须为人类导出文件,则可以使用CSV,但即使如此,我仍会尝试使用写入xlsx文件的库(它们是免费提供的)。


3
它是“逗号”,请参阅RFC 4180。仅仅因为微软在德国破坏了某些东西并不意味着标准化的格式就没有用了……
2014年

不,不是“逗号”-也可能是“字符分隔”,问题不仅仅限于德国。是的,RFC另行指定,但是名为“ csv”的文件可以包含大量不同的分隔符,转义样式等。当您尝试导入此类文件时,程序将导入...某些内容,但不是您想要的内容。
Christian Sauer 2014年

该答案指出了针对CSV的重要陷阱。
gdbj

-3

总的来说 为什么?基本上有JSON和XML可以消除可怕的CSV。它们是很长时间以来使用CSV进行非结构化处理的结构化方法。是的,在某些用例中,仍首选使用CSV,但通常在10个案例中的9个中,最好不要使用CSV。


7
当然,除非您要传输的数据是“平坦的”。然后,通过不传输无用的XML标签等节省了一大笔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.