2011-01-07 5 views
2

Ich habe eine CFG-Datei mit den folgenden Daten:Parsen einer .cfg Datei mit Ruby?

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

ich diese Datei lesen möchten, und speichern Sie die Schlüssel-Wert-Paare in einer Hash-@var[key][val].

Wie kann es gemacht werden?

+0

'@var [Schlüssel] [val]' wäre weder eine gültige Hash-Zuweisung, noch wäre es eine gültige Methode, um auf einen Wert zuzugreifen, der Ihre Daten enthält. '@var [key] = val 'würde zuweisen. '@var [key]' würde auf den Wert zugreifen. –

Antwort

0

Sie sollten die 'parseconfig' gem ausprobieren: https://rubygems.org/gems/parseconfig/

gem install parseconfig 

Hier ist ein Beispiel, wie dieses Juwel verwenden:

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

Viel Glück und viel Spaß Rubin zu lernen. :)

EDIT

Wie Glenux sagte dies nur für einfache Konfigurationsdateien ist. Ich werde nachsehen, ob ich noch etwas finden kann.

EDIT 2

ich nicht ein Juwel oder etwas zu analysieren, eine CFG-Datei wie in Ihrem Beispiel finden. Ich denke, deine einzige Option ist es, einen Parser selbst zu schreiben (wie Nakilon) oder stattdessen etwas wie YAML zu verwenden. Viel Glück trotzdem. :)

0

Die parseconfig-Klasse ist nur für einfache Konfigurationsdateien gedacht!

Es akzeptiert Dateien des Formats "param = value" (cf http://www.5dollarwhitebox.org/drupal/projects#rb-parseconfig) aber es wird die *.*.key_val = { und } Sache nicht analysieren.

Wird die Konfigurationsdatei von Ihnen erstellt oder von einer Drittanbietersoftware erstellt/verwendet? Wenn es Ihnen gehört, kann es sinnvoller sein, ein anderes Konfigurationsdateiformat (JSON, Ini, YAML usw.) zu verwenden.

3

THIS cfg Sie in einer solchen Art und Weise analysieren kann:

  1. Lesedatei File#read
  2. konvertieren Text in 2-dimensionaler Array mit String#scan und regex
  3. convert Array in Hash Hash[]
mit
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"} 

Oder einfach:

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

Ich würde dringend empfehlen, die Konfiguration zu so etwas wie YAML zu übertragen. Es ist leicht verständlich, flexibel, universell implementiert, gut dokumentiert, sowohl als standard als auch als part of the core library, und leicht zu verstehen. (Ja, ich sagte es zweimal absichtlich.)

Meine YAML-Dateien laden in Rubin als Hash, wenn ich so etwas wie:

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

ich in Ruby die ursprüngliche Vorlage für die Konfigurationsdatei erstellen werden, als Hash, serialisiert es dann und schreiben es auf die Festplatte. Auf diese Weise weiß ich, was auf der Platte ist genau die Art, wie YAML es will und hilft mir zu vermeiden, dass "es wird nicht geladen, weil entweder die Daten falsch oder der Code ist falsch" Zwickmühle.

# 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

Zum Ändern einiger Linux-Systemkonfigurationen ist Yaml (leider) keine Option. –

0

wollte diese Ruby-Bibliothek erwähnen, dass Sie Dateiformate übertragen Konfiguration zwischen JSON, YAML oder Windows Ini helfen:

https://github.com/kigster/dupervisor

Der Anwendungsfall ist, um die Konfiguration zu YAML zu bewegen, aber in der Lage zu generieren, was auch immer das Format von der Software benötigt wird - im Fall von diesem Juwel - es ist supervisord das INI-Dateiformat.

Verwandte Themen