2017-02-28 14 views
0

問題が最後に発生したとき: Parsing and structuring of a text file 複雑な条件が想像されるようになりました。 たとえば、私は次にテキストファイルを持っていた:複数レベルの解析テキスト

Head 1 
Subhead 1 
a 10 
b 14 
c 88 
Subhead 2 
a 15 
b 16 
c 17 
d 88 
Subhead 3 
a 55 
b 36 
c 87 
Head 4 
Subhead 1 
r 32 
t 55 
s 79 
r 22 
t 88 
y 53 
o 78 
p 90 
m 44 
Head 53 
Subtitle 1 
y 22 
b 33 
Subtitle 2 
a 88 
g 43 
r 87 
Head 33 
Subhead 1 
z 11 
d 66 
v 88 
b 69 
Head 32 
Subhead 1 
n 88 
m 89 
b 88 
Subhead 2 
b 88 
m 43 

私は次の飛行機に構造テキストが必要です。私は次のデータを取得したい:

Head 1, Subhead 1, c 88 
Head 1, Subhead 2, d 88 
Head 4, Subhead 1, t 88 
Head 53, Subhead 2, a 88 
Head 33, Subhead 1, v 88 
Head 32, Subhead 1, n 88 
Head 32, Subhead 1, b 88 
Head 32, Subhead 2, b 88 

つまり、私は88頭とサブヘッドを示すすべての行を取得したい。

私のアクション:

lines = File.open("file.txt").to_a 
lines.map!(&:chomp) # remove line breaks 

current_head = "" 
res = [] 

lines.each do |line| 
    case line 
    when /Head \d+/ 
    current_head = line 
    when /Subhead/ 
    sub = line 
    when /\w{1} 88/ 
    num = line 
    res << "#{current_head}, #{sub}, #{num}" 
    end 
end 

puts res 

私はこの方法を使用する場合、私はNUM値なしで文字列を取得します。

タスクを実行するかどうかは、「可能な場合」を意味しますか?

答えて

0

eachブロック内で宣言された変数は、繰り返しの間に持続しません。反復が終了すると、これらの変数は消えます。そのため、前のsubの値が失われています。それを修正するには、current_headとあなたが持っているだけのよう、each前にそれを初期化することにより、外側のスコープにsub変数を移動:

current_head = "" 
current_sub = "" 
res = [] 

lines.each do |line| 
    case line 
    when /Head \d+/ 
    current_head = line 
    when /Subhead/ 
    current_sub = line 
    when /\w{1} 88/ 
    num = line 
    res << "#{current_head}, #{current_sub}, #{num}" 
    end 
end 

がrepl.itでそれを参照してください:あなたが残しておきたい場合はhttps://repl.it/GBKn

+0

はあなたのソリューションをありがとう! – Misha1991

0

2回の反復の間の変数、インスタンス変数を使用することができます。

File.foreachは、ファイルを読み込むの推奨される方法です:

res = [] 
File.foreach("file.txt") do |line| 
    line.chomp! 
    case line 
    when /Head \d+/ 
    @current_head = line 
    when /Sub(head|title)/ 
    @sub = line 
    when /\w 88/ 
    num = line 
    res << "#{@current_head}, #{@sub}, #{num}" 
    end 
end 
puts res 
+0

あなたのソリューションをありがとう! foreachは本当に便利です – Misha1991

関連する問題