【问题标题】:Writing YAML files in Ruby: lack of pretty printing formatting options用 Ruby 编写 YAML 文件:缺少漂亮的打印格式选项
【发布时间】:2015-11-14 08:42:46
【问题描述】:

考虑以 YAML 格式写入/读取文件 (http://yaml.org/)

我只是对默认 YAML.dump (Ruby 2.2.3) 中明显缺少输出格式选项感到惊讶。如果没有任何漂亮的打印选项,YAML.dump 看起来真的很难看。我解释一下:

考虑一下这个手写的 YAML 配置文件“config/bots.yml”,其中我有一个项目列表(散列,每个项目都有键“token”和“comment”:

输入文件:

- token: 070743004:yuSJJdB5L354Zq41iGIggSdYGJ1IhVh8XSrA
  comment: ROSPOshop.com

- token: 998001334:zAFo4dBdd3ZZtqKiGdPqkkYGJ1ppVW8pUZ
  comment: pagoSALDO.com bot

- token: 184679990:BBBBBBBBBCCCCCCCGIDDDDDDDHHHHHHHHHH
  comment: SOLYARISoftware demo bot

- token: 184679990:BBBBBBBBBCCCCCCUUUUUUUUUUHHHHHHHHHH
  comment: Another demo bot

- token: 184679990:BBBBBBBBBCCCCCCCGHGGHHGHGHHHHHHHHHH
  comment: Yet Another demo bot

没有详细说明:只是一个加载和一个连续的转储脚本:

config = YAML.load(File.open('config/bots.yml'))
File.open('config/bots.yml', "w") { |f| f.write(YAML.dump(config)) }

输出文件:

---
- token: 070743004:yuSJJdB5L354Zq41iGIggSdYGJ1IhVh8XSrA
  comment: ROSPOshop.com
- token: 998001334:zAFo4dBdd3ZZtqgKiGdPqkkYGJ1ppVW8pUZ
  comment: pagoSALDO.com bot
- token: 184679990:BBBBBBBBBCCCCCCCGIDDDDDDDHHHHHHHHHH
  comment: SOLYARISoftware demo bot
- token: 184679990:BBBBBBBBBCCCCCCUUUUUUUUUUHHHHHHHHHH
  comment: Another demo bot
- token: 184679990:BBBBBBBBBCCCCCCCGHGGHHGHGHHHHHHHHHH
  comment: Yet Another demo bot

我很不高兴,因为所有数组项现在都已折叠(已删除换行符)。如果项目的数量很长并且/或者每个项目的数据结构是一个变量,那将是非常可悲的:阅读混乱!

问题(1) 有任何 YAML 选项可以为 YAML.dump 做一些更漂亮的打印吗? 例如用空行分隔数组中的每个项目?

问题(2) 我发现这个非常有用的教程(“YAML Cookbook”): http://www.yaml.org/YAML_for_ruby.html#yaml_for_ruby

还有关于解释 YAML 提示和技巧(数据转换等)的最新更新/官方 Ruby 文档吗?

问题(3) 任何可能的 YAML 替代方案?我的意思是也许是读/写 YAML 的替代宝石?顺便说一句,我当然考虑过 JSON,但在读取文本数据时我更喜欢更清晰的 YAML 格式!

更新 顺便说一句,这里有很多信息/有用的 YAML 格式提示: https://en.wikipedia.org/wiki/YAML

【问题讨论】:

    标签: ruby file serialization configuration yaml


    【解决方案1】:

    您可以编写自己的漂亮打印解决方案,如果这就是您要寻找的全部内容。例如:

    config = YAML.load(File.open('bots.yml'))
    puts config.to_yaml.gsub("\n-", "\n\n-")
    

    输出:

    ---
    
    - token: 070743004:yuSJJdB5L354Zq41iGIggSdYGJ1IhVh8XSrA
      comment: ROSPOshop.com
    
    - token: 998001334:zAFo4dBdd3ZZtqKiGdPqkkYGJ1ppVW8pUZ
      comment: pagoSALDO.com bot
    
    - token: 184679990:BBBBBBBBBCCCCCCCGIDDDDDDDHHHHHHHHHH
      comment: SOLYARISoftware demo bot
    
    - token: 184679990:BBBBBBBBBCCCCCCUUUUUUUUUUHHHHHHHHHH
      comment: Another demo bot
    
    - token: 184679990:BBBBBBBBBCCCCCCCGHGGHHGHGHHHHHHHHHH
      comment: Yet Another demo bot
    

    【讨论】:

    • 聪明!你是对的->接受!尽管如此,我还是对 YAML Ruby 的实现感到不满。例如,如果我对 YAML.load 没有错,我会丢失 cmets 行,例如 --- #comment
    • Psych,Ruby 实现,包装了LibYAML,一个用 C 语言编写的解析器和发射器。LibYAML 扫描器去除所有空白和 cmets。最终结果:Psych 从未见过 cmets,因此无法保存它们。
    猜你喜欢
    • 2011-01-07
    • 2016-02-20
    • 2020-01-24
    • 2011-05-06
    • 1970-01-01
    • 2012-05-08
    • 2013-06-21
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多