2011-01-07 11 views
2

私は、次のデータと.cfgファイルがあります:私はこのファイルを読み込み、ハッシュ@var[key][val]で、キーと値のペアを格納したいRubyを使って.cfgファイルを解析するには?

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

を。

どうすればいいですか?

+0

'@var [key] [val]'は有効なハッシュ割り当てではなく、データに与えられた値にアクセスする有効な方法でもありません。 '@var [key] = val'が代入します。 '@var [key]'はその値にアクセスします。 –

答えて

0

あなたは 'parseconfig' 宝石を試してみる必要があります。https://rubygems.org/gems/parseconfig/

gem install parseconfig 

ここでこの宝石を使用するには、どのようにサンプルがあります:

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

幸運とRubyを学ぶ楽しみを持っています。 :)

EDIT

Glenuxが、これは簡単なコンフィギュレーションファイルのみで言ったように。他に何かを見つけることができるかどうかチェックします。私はあなたの例のようにcfgファイルを解析するために宝石や何かを見つけることができません

EDIT 2

。私はあなたの唯一の選択肢は、自分でパーサーを書くこと(Nakilonのように)か、代わりにYAMLのようなものを使うことだと思います。とにかく幸運。 :)

0

parseconfigクラスは、単純な構成ファイルのみを対象としています。

"param = value"(cf http://www.5dollarwhitebox.org/drupal/projects#rb-parseconfig)という形式のファイルを受け入れますが、*.*.key_val = {}のものは解析されません。

サードパーティのソフトウェアで設定ファイルを使用しているか、生成/使用していますか?それがあなたのものなら、他の設定ファイル形式(JSON、Ini、YAMLなど)を使用する方が賢明かもしれません。

3

あなたは、このような方法で解析することがありTHIS CFG:Hash[] を使用して

  1. File#read
  2. 変換テキストを使用して、読み取りファイルハッシュにString#scanと正規表現
  3. コンバートアレイを使用して2次元配列に
    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*"([^"]+)/)] 
    
3

私は強くYAMLのようなものに設定を転送するお勧めします。 standardpart of the core libraryの両方として、わかりやすく、柔軟性があり、普遍的に実装され、よく文書化されており、わかりやすくなりました。 (はい、私は2回それを目的で言った。そして、ハッシュとして、私はRubyで設定ファイルの初期テンプレートを作成します

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

それをシリアル化して記述します。)

私のYAMLファイルには、私のような何かをしたときにハッシュとしてのRubyにロードディスクに保存します。そういう意味で私はディスク上にあるものが、YAMLが望むやり方であり、データが間違っているか、コードが間違っているために読み込まれないことを避けるのに役立ちます。ユースケースは、YAMLに設定を移動することです

https://github.com/kigster/dupervisor

、しかし:

# 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"}} 
+0

一部のLinuxシステム構成を変更する場合、yamlは(残念ながら)オプションではありません。 –

0

は、あなたがJSON、YAMLまたはWindowsのINIファイル形式の間で設定を転送することができ、このルビーライブラリーを言及するのを募集しましたソフトウェアが必要とするフォーマットを生成することができます。この宝石の場合、スーパーバイザーのINIファイルフォーマットです。

関連する問題