使用Ruby解析.cfg文件?

时间:2011-01-07 13:33:26

标签: ruby

我有一个包含以下数据的.cfg文件:

*.*.key_val = {
  key1= "value1";
  key2 = "value2";
  key3 = "value3";
};

我想读取此文件并将键值对存储在哈希@var[key][val]中。

怎么做?

5 个答案:

答案 0 :(得分:4)

这个cfg你可以用这样的方式解析:

  1. 使用File#read
  2. 读取文件
  3. 使用String#scan和regex
  4. 将文本转换为二维数组
  5. 使用Hash[]
  6. 将数组转换为哈希值
    text = File.read('your.cfg')
    # => "*.*.key_val = {\n  key1= \"value1\";\n  key2 = \"value2\";\n  key3 = \"value3\";\n};"
    
    data = text.scan(/(\S+)\s*=\s*"([^"]+)/)
    # => [["key1", "value1"], ["key2", "value2"], ["key3", "value3"]]
    
    @var = Hash[data]
    # => {"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
    

    或者只是:

    @var = Hash[File.read('your.cfg').scan(/(\S+)\s*=\s*"([^"]+)/)]
    

答案 1 :(得分:3)

我强烈建议将配置转移到像YAML这样的东西。它易于理解,灵活,普遍实施,文档齐全,包括standardpart of the core library,并且易于理解。 (是的,我故意说了两次。)

当我执行以下操作时,我的YAML文件作为Hash加载到Ruby中:

require 'yaml'
config = YAML.load_file('/path/to/config/file')

我将在Ruby中为配置文件创建初始模板,作为哈希,然后将其序列化并将其写入磁盘。这样我就知道磁盘上的内容正是YAML想要它的方式,并帮助我避免“因为数据错误或代码错误而无法加载”这一点。

# A simple round-trip (load and dump) of an object.

require 'yaml'

test_obj = {
  'foo'           => 'bar',
  'one_two_three' => [1, 2, 3],
  'hash'          => {'another' => 'hash'}
} #=> {"foo"=>"bar", "one_two_three"=>[1, 2, 3], "hash"=>{"another"=>"hash"}}

File.open('./config.yaml', 'w') { |fo| fo.puts YAML::dump( test_obj ) } #=> nil
ruby_obj = YAML::load_file( './config.yaml' ) #=> {"foo"=>"bar", "one_two_three"=>[1, 2, 3], "hash"=>{"another"=>"hash"}}
ruby_obj == test_obj #=> true

require 'pp'
pp ruby_obj
{"foo"=>"bar", "one_two_three"=>[1, 2, 3], "hash"=>{"another"=>"hash"}}

pp test_obj
{"foo"=>"bar", "one_two_three"=>[1, 2, 3], "hash"=>{"another"=>"hash"}}

答案 2 :(得分:0)

你应该试试'parseconfig'gem:https://rubygems.org/gems/parseconfig/

gem install parseconfig

以下是如何使用此gem的示例:

require 'rubygems'
require 'parseconfig'
my_config = ParseConfig.new('your_file.cfg')
puts my_config.get_value('key_val')

祝你好运并学习Ruby。 :)

修改

正如Glenux所说,这仅适用于简单的配置文件。我会检查一下是否能找到其他任何东西。

编辑2

我找不到像你的例子那样解析cfg文件的gem或其他东西。我想你唯一的选择就是自己编写一个解析器(比如Nakilon)或者使用像YAML这样的东西。祝你好运。 :)

答案 3 :(得分:0)

parseconfig类仅适用于简单的配置文件!

它接受格式为“param = value”的文件(cf http://www.5dollarwhitebox.org/drupal/projects#rb-parseconfig),但它不会解析*.*.key_val = {}的内容。

第三方软件是您的配置文件还是由第三方软件生成/使用的?如果它是你的,使用其他配置文件格式(JSON,Ini,YAML等)可能更明智。

答案 4 :(得分:0)

想要提一下这个可以帮助您在JSON,YAML或Windows Ini文件格式之间传输配置的ruby库:

https://github.com/kigster/dupervisor

用例是将配置移动到YAML,但是能够生成软件所需的任何格式 - 在这个gem的情况下 - 它是supervisord的INI文件格式。