2010-08-05 63 views
0

我需要将易于解析的数据存储在文件中,作为数据库支持解决方案的替代方案(不用于辩论)。由于要存储大量数据,因此最好使用轻量级语法。这不一定需要人类可读,但应该可以解析。请注意,将是多种类型的字段/列的,可以使用其中的一些,而另一些不会高效地将可解析的数据存储在文件中?

从我有限的经验没有一个数据库中,我看到几个选项,所有的问题

  • CSV - 我可以在技术上做到这一点,它非常轻。然而,解析将是一个问题,然后它会吸如果我想添加一列。多语言支持是可能的,主要是人们自己的定制解析器
  • XML - 这是从许多方面完美的解决方案,除非涉及解析和开销。这是很多标签,并会产生一个巨大的文件,解析将是非常耗费资源。然而事实上每种语言都支持XML
  • JSON - 这是一个中间立场,但我不想这么做,因为它的尴尬语法和解析不是微不足道的。语言支持是可能的。

所以都有它们的缺点。但是,当试图瞄准语言支持并且文件大小有点小时,最好是什么?

回答

1

如果你只是使用所有这些格式的基础知识,所有的解析器都是微不足道的。如果CSV是一个选项,那么对于XML和JSON,您正在讨论名称/值对的块,因此甚至不涉及递归结构。 json.org几乎支持任何语言。

这就是说。

我没有看到什么问题与CSV。如果人们写错误的解析器,那就太糟糕了。如果您担心兼容性问题,请从Excel中采用默认的CSV模型。任何不能从Excel解析CSV的人都不会在这个世界上走得太远。您在CSV中找到的最弱支持是嵌入换行符和回车符。如果你的数据没有这个,那么这不是问题。只有其他问题是嵌入式引用,并且它们以CSV格式转义。如果你还没有这些,那么它更加微不足道。

至于“添加一列”,你有所有这些问题。如果添加一列,则会重写整个文件。我不认为这是一个大问题。

如果您关心的是空间,CSV是最紧凑的,其次是JSON,其次是XML。没有一个结果文件可以轻松更新。他们几乎都需要重写数据的任何变化。由于CSV没有关闭元素(如JSON和XML),因此CSV具有易于追加的优点。

+0

如果我使用XML,我可以只添加一个新的标签添加元素。我忘记了那个CSV可以导入到excel电子表格中。 – TheLQ 2010-08-05 17:22:38

+0

然后你的XML不符合。从理论上讲,一个XML文件是一个单一的元素,可能有一百万个这样的子元素。并不是说它不能完成,而是有人这样做,只是说你最终得到的是一个包含多个XML元素的文件,而不是一个符合XML文档的文件。 – 2010-08-05 19:02:47

+0

模式 T TheLQ 2010-08-06 04:23:28

3

sqlite怎么样?这将允许您基本上将“DB”嵌入到您的应用程序中,但不需要单独的DB后端。另外,如果你以后最终使用数据库后端,它应该相当容易切换。

如果这不合适,我会建议其中一个用于键值查找的DBM类商店,如Berkely DB或tdb。

+0

SQLite是一种选择,但我真的想平面文件存储,而不只是一个数据库文件中的 – TheLQ 2010-08-05 17:20:45

0

JSON可能是你最好的选择(它是轻微的,更快的解析和自我描述,所以你可以随着时间的推移添加新的列)。你说过可分析 - 你的意思是使用Java? Java的JSON库可以消除大部分工作中的痛苦。此外,还有各种轻质内存数据库能够坚持到一个文件(万一“不是一种选择”意味着你不想要一个大的单独的数据库)

0

如果这只是记录一些数据迅速给文件,我发现制表符分隔的文件比CSV更容易解析,所以如果它是一个你想要的平面文本文件,我会去那里(只要你没有标签在饲料当然)。如果您有固定大小的列,则可以使用固定长度的字段。这更快,因为你可以寻求。

如果它可能需要一些分析非结构化数据,我会去JSON。

如果它是结构化数据和你设想过做任何查询就可以了......我会使用SQLite去。

+0

当您添加比列的其余部分长一个字符的行时,制表符分隔似乎很可怕。数据中可能有选项卡。 – TheLQ 2010-08-05 17:29:48

0

当我需要这样的解决方案时,我写了一个简单的以长度为前缀的数据表示。例如,“Hi”将表示为(十六进制)02 48 69
为了形成行只是巢此操作(第一个数字是字段数,然后将字段),例如,如果字段0包含“喜”和字段1包含“ABC”,那么这将是:

 
Num of fields Field Length Data Field Length Data 
02    02    48 69 03    61 62 63 

您也可以使用第一行作为列的名称。 (我不得不说这是一种DB后端)。

0

您可以使用CSV,如果您只在最后添加列,这很容易处理。即如果列数少于预期,则使用“缺少”字段的默认值。

如果你希望能够改变顺序/使用的字段,您可以添加标题行。即第一行具有列的名称。当您尝试读取数据时,这可能很有用。

+0

所以我会在每行的末尾有3-4个空白列? – TheLQ 2010-08-05 17:27:59

+0

我建议解析器假设,如果它试图读取不存在的字段,它们将被视为空白。 – 2010-08-05 20:57:41

0

如果您被迫使用平面文件,为什么不开发自己的格式?您应该能够调整开销并尽可能多地进行自定义(如果您正在解析大量数据,这很有用)。 数据条目将是固定长度或可变长度,将某些条目强制为固定长度有好处,但您需要创建一个用于分隔两者的方法。如果您有不同的“类型”行,请将每种类型的所有行写入一个块中。每个行块都会有一个标题。使用一个头来描述块的类型,另一个头来描述列和它们的大小。确定您将如何使用标题来描述每个块。

如(H为头,C是列描述和d是数据录入):

H Phone Numbers 
C num(10) type 
D 1234567890 Home 
D 2223334444 Cell 

H Addresses 
C house(5) street postal(6) province 
D 1234_ "some street" N1G5K6 Ontario 
+0

这是我猜想的,但我正在寻找一个标准的存储位置 – TheLQ 2010-08-05 17:27:29

0

我会说,如果你想存储的行和列,你必须使用D B。原因很简单 - 使用除RDBMS以外的任何方法修改结构都需要付出很大的努力,并且您提到将来需要更改结构。

相关问题