我有一个包含以下数据的.cfg文件:
*.*.key_val = {
key1= "value1";
key2 = "value2";
key3 = "value3";
};
我想读取此文件并将键值对存储在哈希@var[key][val]
中。
怎么做?
答案 0 :(得分:4)
这个cfg你可以用这样的方式解析:
File#read
String#scan
和regex Hash[]
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这样的东西。它易于理解,灵活,普遍实施,文档齐全,包括standard和part 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文件格式。