【问题标题】:What's the best flat-file format to hold structured data?保存结构化数据的最佳平面文件格式是什么?
【发布时间】:2012-01-22 11:56:57
【问题描述】:

我有 5 个不同字段的数据(整数、字符串和大字符串的组合),我想将它保存在某种平面文件容器中。我有成千上万个这样的条目,但我不需要任何类型的数据库(根本不需要遍历数据,不需要查询)。我检查过的所有格式(XML、JSON、YAML)都需要每个条目的冗余字段,即使我的数据是结构化的和同质的。 CSV 之类的东西会很棒,除非我不能使用逗号或换行符作为分隔符。你有什么推荐的格式吗?

数据格式示例:

标识 |时代 |短字符串 |网址 |大描述

【问题讨论】:

  • 我有一个问题,如果你不分类你的数据,那么每次你需要从元素1扫描加载到元素Zth?
  • 你能举一个你的数据格式的例子让我们给你一个更具体的解决方案吗?
  • @ajreal 是的,我可能总共扫描了 5 次左右的数据,并且再也不会使用它。
  • @lkuty 刚刚将其添加到我的帖子中。大描述是〜300字左右。可能不包含换行符。

标签: xml json flat-file


【解决方案1】:

您可以使用 JSON 数组而不是对象。通过这种方式,您可以将噪音限制在最低限度。它可以是单个数组或数组数组,具体取决于数据的格式。

它会比 XML 更简洁。不知道 YAML。

例如,您可以:

[
    [123, 123456789, "short string", "http://url", "large ... description"],
    [123, 123456789, "short string", "http://url", "large ... description"],
    [123, 123456789, "short string", "http://url", "large ... description"],
    [123, 123456789, "short string", "http://url", "large ... description"]
]

【讨论】:

  • 我的字段不都是同一种类型(int、strings),我可以把它们都存储在一个 JSON 数组中吗?它会是什么样子?
  • JSON 可以解决这个问题,没问题。数组不必是同构的。
  • 我喜欢这个主意。使用 JSON 的方式有点奇怪,但很有意义。
  • 请注意,在我的示例中,数组值的类型不同,但它们位于每个数组的相同位置:第一个是“id”,第二个是“epoch”,......比如在你的例子中。如果位置也可能不同,那么您需要一种识别它们的方法。在这种情况下,我可以使用 JSON 对象。
  • 实现/使用正确的 JSON 解析器比解析简单的 CSV 要复杂得多。如果您不打算使用完整的 json 功能集(例如表示对象等),那么确实不需要这样的方案。
【解决方案2】:

类似于 CSV 的文件格式似乎很合适,当然您可以在文件中使用您喜欢的任何分隔符,您只需“转义”所使用的字符(如果它们存在于您存储的数据中)。

如果您不想转义单个字符,可以使用不输出您选择使用的任何分隔符的编码方案,例如 Base64


我爸比你强!

什么文件架构是“最好的”取决于很多情况。举个例子;在客户端和服务器之间发送较小的数据块时,我爱上了 JSON。

虽然在平面文件架构中使用它之前我会考虑一次和两次,特别是如果其中包含大量数据。

JSON 在某种程度上是人类可读的,非常适合调试,但在其他方面则没有那么好。

XML 是一种很棒的格式,我喜欢它背后的想法,尽管它太复杂了。

CSV 文件或遵循相同想法的类似模式是我的 5 美分。


示例平面文件架构

标识 |时代 |短字符串 |网址 |大描述

 |            -> ; (delmiter)
 id           -> matching /^[0-9]+$/
 epoch        -> matching /^[0-9]+$/ (also known as unix timestamp)
 url          -> Urls should not contain raw ';',
                 (explicitly check before input)
 short string -> Normalized
 large desc.  -> Normalized

上面的规范化只是指一种清理数据的方法,这样它就不会干扰我们架构的某些部分。

转义 ;\r\n 是我们完成这项工作所需要的,或者只是,如前所述,使用 Base64 等编码算法。

您应该记住您希望存储数据的顺序。如果您想更频繁地解析出url,然后解析出epoch,最好将其放在尽可能远的行的左侧。

如果您希望轻松/快速搜索,您可以/应该将所有“大型描述”存储在单独的文件中,并且仅在需要时获取/处理该数据。

【讨论】:

  • 考虑到我的数据集最多为 10 兆字节(数万行),这不是一个坏主意。我只是不习惯使用随机分隔符和转义字符。但我可能应该克服它。
  • @oxuser 使用 Base64 等编码算法规范化您的数据(在帖子中提到/链接),那么您不必担心分隔符冲突等。
  • 哦,太好了,我从来不知道这件事。 Base64 通常用于什么?像这样的目的?
  • @oxuser 好吧,并没有真正用于此目的.. 尽管它是一种控制用于表示任意字节序列的字符的简单方法。 Base64 仅由可打印字符组成,通常用于表示原始二进制数据。非常流行的 bae64 用例示例:gnu.org/usenet/usenet-gpg-key.txt
  • @oxuser 请将答案标记为已接受,除非您正在寻找替代答案?然后更新您的问题,现在让我来帮助您。谢谢。
【解决方案3】:

您可以使用 CSV 并使用自己的分隔符,例如 $%*,;。否则,您可以转义文本中的逗号和换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2023-02-03
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多