简单,可靠,开放且可互操作的纯文本格式,用于存储数据


17

在上一个问题中,我询问了用于编辑CSV文件的工具。

加文 链接到邓肯·默多克Duncan Murdoch)对R Help的评论, 暗示数据交换格式比CSV是一种更可靠的数据存储方式。

对于某些应用程序,需要专用的数据库管理系统。但是,对于小规模的数据分析项目,更轻量的东西似乎更合适。

考虑以下用于评估文件格式的条件:

  • 可靠:输入的数据应与输入的内容保持真实;数据应在不同软件中一致打开;
  • 简单:如果文件格式易于理解并且理想情况下可以通过简单的文本编辑器读取,那将是很好的选择;编写简单的程序来读写格式应该很容易。
  • open:格式应该是开放的
  • 可互操作的:许多系统应支持文件格式

我发现制表符和逗号分隔的值格式无法满足可靠性要求。尽管我想我可以责怪导入和导出程序,而不是文件格式。我经常发现自己不得不对选项进行一些调整, read.table以防止某些奇怪的字符破坏数据帧的加载。

问题

  • 哪种文件格式最能满足这些需求?
  • 数据交换格式是否是更好的选择?还是有自己的问题?
  • 还有其他更可取的格式吗?
  • 我是否在不公平地评估TSV和CSV?是否有一组简单的技巧来处理此类文件,从而使文件格式更可靠?

2
我要补充一点,R没有,write.DIF()所以恐怕它是一条单向街。
恢复莫妮卡-G.辛普森2010年

1
我不了解csv和可靠性的问题。您是说csv不够严格吗?严格意味着,如果csv的规定足够严格,则遵循这些定义的每个工具都可以加载文件而无需其他参数。
steffen 2010年

@steffen我的意思是:在某些程序中加载并保存一个csv文件会更改csv文件;除非您小心,否则加载csv文件可能会导致不适当的转换;如果添加了奇怪的字符组合而没有适当的转义,则csv文件有时会中断。尽管我听说人们对缺乏官方标准发表了评论,但也许我将csv与格式本身混淆了。当然,我意识到在许多情况下它都可以正常工作。
Jeromy Anglim

5
@steffen:CSV不存储有关文件中存储数据的格式或数据类型的任何信息。您可以在两个不同的应用程序中很好地打开CSV文件,并用两种不同的方式来解释该文件中的数据。
恢复莫妮卡-G.辛普森2010年

1
@JeromyAnglim,我认为更改csv文件取决于您的软件,而不是csv格式本身。
RomanLuštrik2010年

Answers:


9

我想知道这里是否发生标准冲突。

关于文件格式(例如Excel,SQL等)的一个抱怨是,您必须预先定义数据类型才能使其表现良好,这与“重量更轻”的标准背道而驰(据我所知,您限制了更多时间相关而非计算相关)。

相反,不对数据进行处理或不允许对数据进行处理的条件要求进行一些错误检查。除非您让系统自动神奇地找出数据类型(这实际上就是Excel使您失败的原因),否则您也无法吃掉蛋糕。

国际海事组织,在两个方面,第二个标准更为重要。数据完整性一旦遭到破坏,将使分析变得困难或不可能。丢失观测值或无效值(如果未正确检查)可能会使所有内容混乱。

关于DIF,实际的原始文本不是人类可读的,并且人类很难输入数据(IMO)。

IMO,您应该给定界文件一个公平的摇动。如上文注释中所述,“数据处理”主要是您所使用的工具子集的故障。行为良好的程序不应破坏分隔的文件。整改的最大来源是分隔符指定不正确。例如,如果您的数据可能包含逗号,则CSV是不合适的。如果可能带有选项卡,则TSV不适合。对于许多(但不是全部)程序,您可以指定备用定界符。例如,我在一些困难的情况下使用了波浪号(〜)。


谢谢。听起来好像最好使用分隔文件格式,这是最佳选择。
Jeromy Anglim

6

认真地说,我会考虑由R本身创建的RData文件

  • 可靠(检查)
  • 简单(称之为平局-格式为二进制)
  • 打开(检查:没有比R源代码更开放)
  • 互操作的(检查:在R处都可工作)

对我来说足够接近。如果说系统是指应用程序而不是操作系统,那么最后一点就是失败。

哦,RData非常有效,因为现在默认情况下压缩文件(以前是默认关闭的选项)。


2
RData当然可以与R很好地配合使用。在版本控制方面可能会出现问题。我想R函数dput()提供了与版本控制一起使用的纯文本替代方案。但是,csv / tsv的吸引力之一是,当我与数据共享存储库时(例如期刊文章),人们可以获取数据并使用喜欢的任何软件轻松地对其进行重新分析。
Jeromy Anglim

1
是的,这是一件非常复杂的事情。我认为人们从计算的曙光开始就对此进行讨论。我还有两个想法(我可以扩大答案):ProtocolBuffer非常适合与Python,Java,C ++,...和许多其他语言有效地共享;Romain和我介绍了R。新网站mldata.org涵盖了有关机器学习的研究-他们甚至拥有可以转换的工具。那可能值得一看。
Dirk Eddelbuettel 2010年

1
实际上,SVN可以毫无问题地获取二进制斑点(例如pdf文件)。我怀疑git也这样做。
Dirk Eddelbuettel,2010年

了解二进制Blob真是太好了。能够在文本文件上运行diff并获取有关更改的有意义的信息仍然是很好的。也感谢您链接到mldata.org。看起来很有趣。
Jeromy Anglim

乐趣。姐妹网站mloss.org简直很棒,如果希望他们对mldata.org有所帮助。现在是时候了。
Dirk Eddelbuettel,2010年

4

为了回应Dirk Eddelbuettel的回答,我建议使用HDF5文件格式。它不像RData格式那么简单,或者您可能会说“更丰富”,但是肯定具有更高的互操作性(可以在C,Java,Matlab等中使用)。我发现涉及大型HDF5文件的I / O非常快。


(+1)与NetCDF相比,它的性能有何想法?
chl 2010年

IIRC也是在mldata.org上选择的内部格式-带有一组转换工具。转换器可能值得一看。我一直觉得R对HDF5的支持不够完美。
Dirk Eddelbuettel,2010年

@chl我曾模糊地认为NetCDF在内部使用了HDF5,但这似乎不太准确。
shabbychef 2010年

2

我不太确定为什么带有适当的元数据的固定文本格式不符合您的条件。读起来并不像分隔符那么简单,但是无论如何,您都需要元数据来使用该信息。编写语法以读取程序的任务仅取决于数据集结构的大小和复杂程度。SPSS和Excel具有GUI来帮助完成这些任务。

我遇到的CSV文件只有两个错误:

  1. 没有分隔符的缺少字段(因此该记录中的所有其他字段都放错了位置,我也遇到了XML缺少标签的问题)
  2. 文本字符串中的逗号

(如果遇到其他问题,请举个例子)

如前所述,可以使用更加不规则的定界符来解决两个问题(管道(|)是我之前遇到的一个管道,但是波浪号(〜)的工作原理也很好,因为字符串字段中都可能不包含这两个管道。)一个是您所使用的任何软件都无法轻松解决该问题,这都是人们编写文件的方式的问题,而不是用于读取文件的软件。

我也想说我在这个线程和他的线程上都同意Drnexus 在最近另一个有关编辑这些文件的线程上回答。您似乎在抱怨所使用的软件(尤其是Excel),并要求以符合不良软件的格式存储数据。也许问题应该是如何使Excel停止自动格式化纯文本文件。在我看来,您的可靠标准是读取纯文本文件的软件问题。我没有使用R来进行数据管理,但是您似乎并不费劲地用SPSS读取分隔的文件。

如果原始文件未正确写入,那么什么使您期望任何软件都能可靠地读取文件?特定的文件格式肯定不会阻止您将数据错误地写入任何选择的文件类型。


(1)我希望能够像打开Rdata,Excel或SPSS数据文件一样轻松地打开和关闭数据文件。花时间通过向导可以工作,但这并不是我理想的简单可靠的工作流程。(2)是的,我同意使用不规则的定界符。通常,Tab在大多数情况下对我来说就足够了;(3)我在CSV / TSV方面没有很大的问题。我偶尔遇到容易解决的问题。但是,我不想考虑分隔符和格式转换的问题。
Jeromy Anglim

@Jeromy Anglim,对于第一点,我想您通常只需要执行一次(除非您经常在两个无法读取或输出其他文件的不同环境之间迁移)。对于第3点,固定文本文件解决了该问题。我从未遇到过SPSS错误地格式化其他文件类型的情况。如果您不需要分发文件,那么整个问题都是无声的,如果您可以使文件正确保存在您将要使用的任何环境中,则不再需要转换/存储。
Andy W 2010年

1

纯文本格式的常见问题是它无法存储元数据。您如何定义丢失的数据?您如何以纯文本格式定义1 =完全不同意,2 =不同意... ...之类的东西?对于纯文本格式,您必须使用另一个文档来定义那些元数据。而且在XML中不容易做到。

有时,这个问题可能非常令人不安。

我的解决方案是使用SPSS数据格式,该数据格式自包含且易于在SPSS中进行编辑。我知道这不是您问题的正确答案,但是很长一段时间以来我一直在同一个问题上苦苦挣扎,这是我目前的解决方案。

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.