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

分割を使用してチャンクを解析するか、おそらくファイルを反復処理して.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 に答える