如何在ruby中读取INI文件

如何在ruby中读/写一个ini文件。 我有一个我需要的ini文件

  1. 改变一个条目
  2. 写到不同的位置

我怎么能用ruby做到这一点? 关于这方面的文件很惨淡。

我最近使用ruby-inifile 。 与这里的简单片段相比,这可能是过度杀伤…

使用InIFile Gem

正如@method所说,使用inifile gem。 还有一个inigem,但我没有使用它。

我发现这里的文档比这里的文档更有帮助,这是gem页面链接到的地方。

没有太多的例子,所以这里有一些代码可以帮助你入门:

示例设置

首先,使用以下内容创建文件/tmp/desktop.ini

 [Desktop Entry] Version=1.0 Type=Application Name=Foo Viewer Comment=The best viewer for Foo objects available! TryExec=fooview Exec=fooview %F Icon=fooview 

确保从命令行运行gem install inifile

示例代码

使用以下内容创建/tmp/ini-test.rb类的文件:

 require 'inifile' require 'pp' # read an existing file file = IniFile.load('/tmp/desktop.ini') data = file["Desktop Entry"] #output one property puts "here is one property:" puts data["Name"] # pretty print object puts "here is the loaded file:" pp file # create a new ini file object new_file = IniFile.new # set properties new_file["Desktop Entry"] = { "Type" => "Application", "Name" => 'test', "Exec" => 'command', } # pretty print object puts "here is a object created with new:" pp new_file # set file path new_file.filename = "/tmp/new_ini_file.ini" # save file new_file.write() puts "the new object has been saved as a file to /tmp/new_ini_file.ini" 

示例结果

使用ruby /tmp/ini-test.rb运行该文件应该会产生如下内容:

 here is one property: Foo Viewer here is the loaded file: { this output hidden for brevity } here is a object created with new: # {"Type"=>"Application", "Name"=>"test", "Exec"=>"command", "Icon"=>"icon_filename", "Comment"=>"comment"}}, @param="="> the new object has been saved as a file to /tmp/new_ini_file.ini 

根据需要修改以满足您的需求。

这是用于读取和写入.ini文件的模块,尽可能少地更改原始文件(对于读取人和机器的文件):

 class IniFileExc 

IniNode类
def initialize(name,value = nil)
@line_start = -1;
@line_end = -1;
@level = 0;
@name = name;
@value = value;
@keys = {};
@keylist = [];
@modified = false;
@deleted = false;
结束
attr_reader:level,:line_start,:line_end,:name,:value,:keylist,:keys,:modified,:deleted
attr_writer:level,:line_start,:line_end,:name,:value,:keylist,:keys,:modified,:deleted

def to_str
return @ name.to_s +'='+ @ value.to_s;
结束

def to_s
return @ value.to_s;
结束
def to_i
return @ value.to_i
结束
def to_f
return @ value.to_f;
结束

高清
insert(key,nil);
return @keys [key];
结束

def插入(键,值)
如果返回false(@ keys.has_key?(key));
node = nil;
if(value &&((value.class == IniNode)||(value.class == IniSection)))
node = value;
其他
if(@level <= 0) node = IniSection.new(key); 其他 node = IniNode.new(键,值) 结束 结束 node.line_start = @line_end + 1 if(node.line_start <0); node.level = @level + 1; @keys [key] = node; @ keylist.push(键); 返回true; 结束

def [] =(键,值)
rc = insert(key,value);
@keys [key] .value = value;
@keys [key] .modified = true;
@modified = true;
结束

def删除(键)
如果返回false(!@ keys.has_key?(key));
@keys [key] .deleted = true;
@modified = true;
结束
结束

IniSection类

def to_str
return('['+ @name +']');
结束
结束

 IniFile类

def reload
开始
input = File.new(@name,“r”);
拯救
提高;
其他
prevnode = node = self;
lineno = 0;
input.each do | line |
@ lines.push(线);
parsed_node = parse_line(lineno,line);
if(parsed_node);
if(parsed_node.class == IniSection)
if(parsed_node!= node)
prev_node = node;
node = parsed_node;
insert(node.name,node);
prev_node.line_end = lineno - 1;
结束
其他
node.insert(parsed_node.name,parsed_node);
结束
结束
lineno + = 1;
结束
input.close;

  node.line_end = @line_end = lineno - 1; end 

结束

def parse_line(lineno,line)
return nil if(line =〜/ ^ \ s * $ /);
return nil if(line =〜/ ^ \ s *#/);
return nil if(line =〜/ ^ \ s *; /);
if(line =〜 / ^\s*[\s*(.+ ) \s*]。 $ /)
rv = IniSection.new($ 1);
rv.line_start = lineno;
rv.level = @level + 1;
返回rv;
elsif(line =〜/ ^ \ s (\ S?。 [^ = \ s])\ s = \ s *(\ S?[^#;] [^#; \ s \ n])。 $ /)
rv = IniNode.new($ 1,$ 2);
rv.line_start = rv.line_end = lineno;
rv.level = @level + 2;
返回rv;
结束
返回零;
结束

def写
inserted = {};
@ keylist.each do | sect |
sectnode = @keys [sect];
next if(!sectnode.modified || sectnode.deleted);
if(sectnode.line_end <0)
@ lines.push( “\ n”);
@ lines.push(sectnode.to_str +“\ n”);
结束
sectnode.keylist.each do | key |
keynode = sectnode.keys [key];
next if(!keynode.modified || keynode.deleted);
if(keynode.line_end <0)
if(sectnode.line_end <0)
@ lines.push(keynode.to_str +“\ n”);
其他
idx = sectnode.line_end.to_i;
inserted [idx] = [] if(!inserted.has_key?(idx));
插入[IDX] .push(keynode.to_str);
结束
其他
line = @lines [keynode.line_start];
if(line =〜/ ^(\ s *)(\ S?。 [^ = \ s] \ s = \ s * \ S?。+ [^#; \ s])(\ s * [#;] 。 )$ /)
line = $ 1 + keynode.to_str + $ 3 +“\ n”;
其他
line = line.gsub(/ ^(\ s )(\ S?。 [^ = \ s] \ s = \ s * \ S?[^#;] + [^#; \ n \ s])(。 *)$ /){
$ 1 + keynode.to_str + $ 3};
结束
@lines [keynode.line_start] = line;
结束
结束
结束

     deleted = {};
     @ keylist.each do | sect |
       sectnode = @keys [sect];
       next if(!sectnode.deleted &&!sectnode.modified);
       if(sectnode.deleted &&(sectnode.line_start> = 0)&&(sectnode.line_end> = 0)\
           &&(sectnode.line_end> = sectnode.line_start))
        我在sectnode.line_start..sectnode.line_end
          删除[i] = true;
        结束
      结束
       sectnode.keylist.each do | key |
         keynode = sectnode.keys [key];
         next if(!keynode.deleted);
        删除[keynode.line_start.to_i] = true \
           if((keynode.line_start> = 0)&&(keynode.line_end> = 0)&&(keynode.line_start == keynode.line_end));
      结束
    结束 

 begin file = File.new(@name, 'w'); rescue raise(IniFileExc, "Failed to open " + @name + " for writing: #{$!}", caller); else cnt = -1; @lines.each do |line| cnt += 1; if (inserted.has_key?(cnt)) inserted[cnt].each do |ins| file.puts(ins + "\n"); end end next if (deleted[cnt]); file.puts(line); end file.close; end 

结束
结束

用法示例:

 begin ini = IniFile.new('file.ini'); ini['common']['param'] = 'value'; ini['common'].delete('unused_param'); ini.delete('unused_section'); print "Valuable value: ", ini['common']['param'], "\n"; ini.write; rescue IniFileExc print "Oh, that's not good: ", $!, "\n"; end 

希望这可以帮助。

这是另一种选择: http : //rubygems.org/gems/ini

如果我理解正确,

 outFile = File.new('out.ini', 'w') File.open('in.ini', 'r') do |inFile| inFile.each_line do |line| # foo is the entry you want to change, baz is its new value. outFile.puts(line.sub(/foo=(.*)/, 'foo=baz')) end end outFile.close 

请注意,将File.open与块一起使用File.open ,该块将在块终止时自动关闭。

 file = File.new("your.ini", "r") while (line = file.gets) puts "#{line}" #additionally make changes end file.close