Анализ файла .cfg с использованием Ruby? - PullRequest
2 голосов
/ 07 января 2011

У меня есть файл .cfg со следующими данными:

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

Я хочу прочитать этот файл и сохранить пары ключ-значение в хэше @var[key][val].

Как этоможно сделать?

Ответы [ 5 ]

4 голосов
/ 07 января 2011

ЭТУ cfg вы можете анализировать следующим образом:

  1. читать файл, используя File#read
  2. конвертировать текст в 2-мерный массив, используя String#scan и регулярное выражение
  3. преобразовать массив в хеш, используя 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*"([^"]+)/)]
3 голосов
/ 07 января 2011

Я бы настоятельно рекомендовал перенести конфигурацию на что-то вроде YAML. Он сделан простым для понимания, гибким, универсально реализованным, хорошо документированным как в виде стандарта , так и в качестве части базовой библиотеки и простым для понимания. (Да, я специально сказал это дважды.)

Мои файлы YAML загружаются в Ruby в виде хэша, когда я делаю что-то вроде:

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

Я создам исходный шаблон для файла конфигурации в Ruby как Hash, затем сериализую его и запишу на диск. Таким образом, я знаю, что то, что находится на диске, именно так, как того хочет 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"}}
0 голосов
/ 13 июля 2016

Хотелось бы упомянуть эту библиотеку ruby, которая может помочь вам перенести конфигурацию между форматами файлов JSON, YAML или Windows Ini:

https://github.com/kigster/dupervisor

Вариант использования - переместить конфигурацию в YAML., но иметь возможность генерировать любой формат, необходимый программному обеспечению - в случае с этим самоцветом - это формат файла INI супервизора.

0 голосов
/ 07 января 2011

Класс parseconfig предназначен только для простых файлов конфигурации!

Он принимает файлы в формате "param = value" (cf http://www.5dollarwhitebox.org/drupal/projects#rb-parseconfig), но не будет анализировать вещи *.*.key_val = { и }.

Является ли файл конфигурации вашим или создан / использован сторонним программным обеспечением? Если он принадлежит вам, возможно, разумнее использовать другой формат файла конфигурации (JSON, Ini, YAML и т. Д.).

0 голосов
/ 07 января 2011

Вы должны попробовать гем '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

Как сказал Гленукс, это только для простых файлов конфигурации. Я проверю, смогу ли я найти что-нибудь еще.

РЕДАКТИРОВАТЬ 2

Я не могу найти драгоценный камень или что-то для разбора файла cfg, как в вашем примере. Я думаю, что ваш единственный вариант - написать парсер самостоятельно (как это делал Накилон) или использовать что-то вроде YAML. В любом случае, удачи. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...