【问题标题】:How to parse output of array.inspect back into an array如何将array.inspect的输出解析回数组
【发布时间】:2011-09-21 06:16:51
【问题描述】:

我想将多维数组存储在文本文件中并有效地重新加载它们。棘手的部分是该数组包含的字符串可能看起来像 " ] , [ \\\"" 或任何东西。

将表格写入文件的最简单方法是 my_array.inspect(对吗?)

然后,我如何从可能看起来像 "[\" ] , [ \\\\\\\"\"]" 的文本文件读回的字符串尽可能快速且轻松地重新创建数组?

【问题讨论】:

  • 如果您可以发布一个文本文件示例,这可能会有所帮助,这样我们就可以准确地看到您要完成的工作。

标签: ruby arrays string parsing


【解决方案1】:

如果您的数组仅包含字面书写的对象,例如数字、字符串、数组、哈希,您可以使用eval

a = [1, 2, 3].inspect
# => "[1, 2, 3]"

eval(a)
# => [1, 2, 3]

【讨论】:

  • 这正是我想知道的。虽然我还是选择了 YAML 选项。
  • eval() is evil 很慢。只是说。
  • 我同意 Kudu 的观点,eval() 是错误的方法。使用纯文本(Yaml、JSON)或二进制(Marshal),但要非常小心依赖执行任意 Ruby 代码作为序列化形式。
【解决方案2】:

在我看来,这听起来太麻烦了。请改用YAML

require 'yaml'
a = [ [ [], [] ], [ [], [] ] ]
File.open("output.yml", "w") do |f|
  f.write a.to_yaml
end
b = YAML.load File.open('output.yml', 'r')

您也可以改用JSON

【讨论】:

    【解决方案3】:

    假设你有数组

    ary
    

    您可以将数组写入文件:

    File.open(path, 'w') { |f| f.write Marshal.dump(ary) }
    

    然后通过将文件读入字符串并说

    重新创建数组
    ary = Marshal.load(File.read(path))
    

    【讨论】:

    • 有趣的解决方案,但二进制序列化有它自己的一系列问题。我尽量避免在生产中使用 Marshal / pickle,而是使用 YAML 或 JSON。
    • 如果你想要一个纯文本序列化格式,你可能想使用 yajl-ruby gem...他们说它比 Marshal 还要快...将“Marshal.dump”替换为“Yajl:: Encoder.encode”和“Marshal.load”与“Yajl::Parser.parse”
    • Nat,二进制序列化很棘手,仅适用于一种编程语言。使用 YAML 或 JSON,您可以将数组加载到 Ruby、Python、C 等中。此外,如果某些内容无法正常工作,您可以查看文本文件进行调试,而不是解析二进制数据。
    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多