【问题标题】:Ruby's YAML only loads first Records from a large File, why?Ruby 的 YAML 只从一个大文件中加载第一条记录,为什么?
【发布时间】:2011-06-16 11:46:24
【问题描述】:

好的,我有以下 YAML 文件,它是使用 yaml_db 为 Rails 生成的。所以这基本上是我的 Rails 数据库的自动生成导出:

--- 
admins: 
  columns: 
  - id
  - username
  - email
  - encrypted_password
  - password_salt
  - sign_in_count
  - current_sign_in_at
  - last_sign_in_at
  - current_sign_in_ip
  - last_sign_in_ip
  - failed_attempts
  - unlock_token
  - locked_at
  - created_at
  - updated_at
  records: 
  - - 1
    - 
    - lalala@lalala.at
    - $2a$10$dZU50HD6paWS7EjKuWAruOFdwt9eqxiNTRh/D4sj8cqSzy5gjYd2i
    - $2a$10$dZU50HD6paWS7EjKuWAruO
    - 86
    - 2011-01-27 07:37:45 Z
    - 2011-01-26 13:27:13 Z
    - 12.34.56.78
    - 12.34.56.78
    - 0
    - 
    - 
    - 2010-12-23 09:20:46 Z
    - 2011-01-27 07:37:45 Z
  - - 2
    - admin
    - lalalalala@lalalala.com
    - $2a$10$3DML64hdCCvG90bnhIpN/unEEm6C.a9FqGrAFlFHU0.2D54DSQ1Ni
    - $2a$10$3DML64hdCCvG90bnhIpN/u
    - 1
    - 2011-01-21 09:52:14 Z
    - 2011-01-21 09:52:14 Z
    - 12.34.56.78
    - 12.34.56.78
    - 0
    - 
    - 
    - 2011-01-05 14:29:49 Z
    - 2011-01-21 09:52:14 Z

--- 
experiments: 
  columns: 
  - id
  - description
  - startdate
  - enddate
  - maps_base_URI
  - maps_count
  - queries_count
  - proposals_count
  - created_at
  - updated_at
.......

现在,当我尝试在 Ruby 中加载此 YAML 文件时:

file = YAML.load(File.open("data-2011-01-27.yml"))

它不会加载超过第一个admin,甚至不会加载experiments

ruby-1.9.2-p0 > file.keys
 => ["admins"]

ruby-1.9.2-p0 > file["admins"]["records"].count
 => 1 

这是为什么呢?我会假设自动生成的 .yml 文件在语法上是正确的?当我运行 rake:db:dumprake:db:load 时,它工作得很好。

【问题讨论】:

    标签: ruby parsing yaml


    【解决方案1】:

    三个连字符 (---) 分隔多个文档。请参阅YAML.load_stream 将它们全部加载:

    documents = YAML.load_stream(open("data-2011-01-27.yml")).documents
    documents.map(&:keys)
    #=> [["admins"], ["experiments"]]
    

    【讨论】:

    • YAML.load_stream 的链接不再有效。这是load_stream 的另一个文档。
    • 这只适用于 Psych 实现,它是唯一活着的实现......也许他们最终可以更新 ruby​​ 2.x 的文档,因为 1.8 和 1.9 仍然支持 syck 实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多