多级解析文本

我最后一次遇到问题: 解析和构造文本文件现在我想象复杂的条件。 例如。 我有一个文本文件,其中包含:

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值的字符串。

是否可以执行我的任务意味着什么时候?

each块内声明的变量在迭代之间不会持久存在。 当迭代结束时,这些变量消失,这就是你丢失前一个sub值的原因。 要解决此问题,请将sub变量移动到外部作用域,方法是在each变量之前将其初始化,就像使用current_head

 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

如果要在两次迭代之间保留变量,可以使用实例变量。

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 
Interesting Posts