我需要将易于分析的数据存储在文件中,作为数据库支持的解决方案的替代方案(不用讨论)。由于它将存储大量数据,因此最好是轻量级语法。这不一定是人类可读的,但应该是可解析的。请注意,将有多种类型的字段/列,其中一些可能会被使用,而其中一些将不会
根据我没有数据库的有限经验,我看到了几个选项,都有问题
所有人都有自己的缺点。但是,当试图寻求语言支持和文件大小时,最好的是什么?
答案 0 :(得分:3)
sqlite怎么样?这将允许您基本上在应用程序中嵌入“DB”,但不需要单独的DB后端。
此外,如果您以后最终使用数据库后端,则切换起来相当容易。
如果这不合适,我会建议一个类似DBM的商店进行键值查找,例如Berkely DB或tdb。
答案 1 :(得分:1)
如果您只是使用所有这些格式的基础知识,那么所有解析器都是微不足道的。如果CSV是一个选项,那么对于XML和JSON,你说的是名称/值对的块,所以甚至没有涉及递归结构。 json.org几乎支持任何语言。
那就是说。
我不知道CSV有什么问题。如果人们写错解析器,那就太糟糕了。如果您担心兼容性,请使用Excel中的默认CSV模型。任何无法从Excel解析CSV的人都不会在这个世界上走得太远。您在CSV中找到的最弱支持是嵌入式换行和回车。如果您的数据没有这个,那么这不是问题。只有其他问题是嵌入式报价,并且这些报价以CSV格式转义。如果你没有那些,那么它就更加微不足道了。
对于“添加列”,所有这些都存在问题。如果添加列,则可以重写整个文件。我也不认为这是一个大问题。
如果您关心空间,CSV是最紧凑的,其次是JSON,其次是XML。生成的文件都不能轻易更新。他们几乎都需要为数据的任何变化进行重写。 CSV的优点是可以轻松附加,因为没有关闭元素(如JSON和XML)。
答案 2 :(得分:0)
JSON可能是你最好的选择(它更轻松,解析速度更快,并且具有自描述性,因此您可以随着时间的推移添加新列)。你说可解析 - 你的意思是使用Java吗?有一些Java的JSON库可以解决大部分工作带来的痛苦。内存数据库中还有各种轻量级数据可以持久保存到文件中(如果“不是选项”意味着你不需要一个大的独立数据库)
答案 3 :(得分:0)
如果这只是为了快速将一些数据记录到文件中,我发现制表符分隔文件比CSV更容易解析,所以如果它是一个平面文本文件你正在寻找我会去那(只要你当然没有饲料中的标签)。如果您有固定大小的列,则可以使用固定长度字段。这更快,因为你可以寻求。
如果是可能需要进行分析的非结构化数据,我会选择JSON。
如果它是结构化数据并且您想要对它进行任何查询......我会选择sqlite。
答案 4 :(得分:0)
当我需要这样的解决方案时,我写了一个前缀为length的数据的简单表示。例如,“Hi”将表示为(十六进制)02 48 69
要形成行,只需嵌套此操作(第一个数字是字段数,然后是字段数),例如,如果字段0包含“Hi”而字段1包含“abc”,那么它将是:
Num of fields Field Length Data Field Length Data 02 02 48 69 03 61 62 63
您还可以使用第一行作为列的名称。 (我不得不说这是一个数据库后端)。
答案 5 :(得分:0)
您可以使用CSV,如果只添加列,则可以轻松处理。即如果列数少于预期,请使用“缺失”字段的默认值。
如果您希望能够更改字段的顺序/用途,可以添加标题行。即第一行具有列的名称。当您尝试读取数据时,这非常有用。
答案 6 :(得分: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
答案 7 :(得分:0)
我想说如果你想存储行和列,你必须使用数据库。原因很简单 - 使用除RDBMS之外的任何方法修改结构都需要付出很大的努力,并且您提到要在将来更改结构。