当前位置 : 主页 > 编程语言 > ruby >

使用ruby从yml文件中提取数据

来源:互联网 收集:自由互联 发布时间:2021-06-23
我阅读了一些关于Yaml或yml文件格式的快速教程.我制作了一个yaml文档来表示我的数据.我看到了一些 ruby教程,告诉你如何用 ruby提取yaml.不幸的是,他们只是打印整个数据或只是键和值.它不
我阅读了一些关于Yaml或yml文件格式的快速教程.我制作了一个yaml文档来表示我的数据.我看到了一些 ruby教程,告诉你如何用 ruby提取yaml.不幸的是,他们只是打印整个数据或只是键和值.它不符合我的需要.请帮忙.

yaml文件 –

dev:
  game1:
    server1:
        url: 'dev-game1-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game1-a-srv02.gamer.com'
        log-path: '/srv/logs'

  game2:
    server1:
        url: 'dev-game2-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game2-b-srv02.gamer.com'
        log-path: '/srv/logs'
    server3:
        url: 'dev-game2-b-srv01.gamer.com'
        log-path: '/srv/logs'
prod: 
etc....

如何使用ruby代码选择dev,game2,server 3,url?

使用下面的代码,我得到一个例外 –

require 'yaml'

def server_info
    path = 'C:\Code\demo-srv.yml'
    yml = YAML::load(File.open(path))
    game2 = yml['dev']['game2'] 
    game2.each{|server|
        if server['server3']
            puts server['server3']['url']
        end
    }
end

server_info

错误 –

server.rb:8:in `[]': can't convert String into Integer (TypeError)
        from server.rb:8:in `server_info'
        from server.rb:7:in `each'
        from server.rb:7:in `server_info'
        from server.rb:14
您是否定义了yaml-data,或者您只是现有yaml文件的使用者?

如果你定义了它,我会用Hash替换服务器数组(参见缺少的 – 在服务器名称之前):

dev:
  game1:
    server1:
        url: 'dev-game1-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game1-a-srv02.gamer.com'
        log-path: '/srv/logs'

  game2:
    server1:
        url: 'dev-game2-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game2-b-srv02.gamer.com'
        log-path: '/srv/logs'
    server3:
        url: 'dev-game2-b-srv01.gamer.com'
        log-path: '/srv/logs'

然后你可以尝试yml [‘dev’] [‘game2’] [‘server3’] [‘url’].

注意:没有检查丢失/错误的数据.如果game2的条目错过,此代码将引发异常.

所以,也许你应该做类似的事情

if yml['dev'] and yml['dev'].kind_of?(Hash)
  if yml['dev']['game2'] and ....
  ...
else
  puts "No dev-branch defined"
end

否则,您可以尝试以下方式:

def server_info
    yml = YAML::load(DATA)
    yml['dev']['game2'].each{|server|
      if server['server3']
        p server['server3']['url']
      end
    }
end

注意(两种解决方案):

没有检查丢失/错误的数据.这里检查服务器[‘server3’]的存在.对于实际代码,您还应该检查dev和game2数据的存在.

编辑后继续回答:

如果您有一个数组但是期望一个哈希并且您尝试使用字符串访问数组元素,则通常会抛出将String转换为Integer的错误.

您可以尝试以下代码.有两个变化:

>第8行包含服务器的输出 – 你会看到它是一个数组,没有哈希.
>第9行10:数组由两个元素检查和使用(通过#first和#last)

require 'yaml'

def server_info
    path = 'C:\Code\demo-srv.yml'
    #~ yml = YAML::load(File.open(path))
    yml = YAML::load(DATA)
    game2 = yml['dev']['game2'] 
    game2.each{|server|
        p server    #-> you get an array
        if server.first == 'server3'
            puts server.last['url']
        end
    }
end

server_info

文件 –

dev:
  game1:
    server1:
        url: 'dev-game1-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game1-a-srv02.gamer.com'
        log-path: '/srv/logs'

  game2:
    server1:
        url: 'dev-game2-a-srv01.gamer.com'
        log-path: '/srv/logs'
    server2:
        url: 'dev-game2-b-srv02.gamer.com'
        log-path: '/srv/logs'
    server3:
        url: 'dev-game2-b-srv01.gamer.com'
        log-path: '/srv/logs'
网友评论