1

这可能是一个更一般的编程问题,但我想知道 ruby​​ 解决这个问题的最佳实践是什么。我想解析一个具有如下结构的文件:

toplevel blah blah 0
  attr0: foo
  attr1: bar
  nextlevel something 0
    child0: baz
    child1: boz
      var1: blah    
  nextlevel something 1
    child0: faz
      abc: yes
    child1: foz

我考虑过使用 split 并解析出块,或者可能迭代文件,.each_line然后以某种方式(我不知道如何)进行嵌套迭代

我想,嵌套线看起来像这样:

input.each_line do |line|
  #parse attributes 
  if line =~ /nextlevel:\s+(\d)/ then
     #now advance the line count somehow and continue parsing in here
  end

PS 抱歉,如果示例中的名称有点混乱,但我试图想出一个简化的 MWE。

4

2 回答 2

2

这是您要提取的排序结构吗?

def parse(inp, level)
    until inp.eof?
        line = inp.gets
        if line =~ /nextlevel:\s+(\d)/
            parse(inp, $1.to_i)
        else
            puts "got line: '#{line.strip}' at level #{level}"
        end
    end
end

irb(main):070:0> parse(input, -1)
got line: 'toplevel: 0' at level -1
got line: 'attr0: foo' at level -1
got line: 'attr1: bar' at level -1
got line: 'child0: baz' at level 0
got line: 'child1: boz' at level 0
got line: 'child0: faz' at level 1
got line: 'child1: foz' at level 1
=> nil

这使用递归方法来跟踪使用堆栈的深度,但使用变量和迭代方法同样简单。

于 2012-08-01T23:06:17.597 回答
1

看起来像 YAML 格式... ruby​​ 有一个模块可以为您解析http://corelib.rubyonrails.org/classes/YAML.html

于 2012-08-01T22:17:20.653 回答