解析和构造文本文件

我需要帮助,我使用Ruby。 我有一个文本文件,其中包含:

Head 1 a 10 b 14 c 15 d 16 e 17 f 88 Head 4 r 32 t 55 s 79 r 22 t 88 y 53 o 78 p 90 m 44 Head 53 y 22 b 33 Head 33 z 11 d 66 v 88 b 69 Head 32 n 88 m 89 b 88 

我想解析并将此文件结构化到下一个平面。 我想获得下一个数据:

 Head 1, f 88 Head 4, t 88 Head 33, v 88 Head 32, n 88 Head 32, b 88 

请告诉我如何在ruby上制作这样的代码?

我想首先我把它放在数组中的所有行:

 lines = Array.new File.open('C:/file/file.txt', 'r').each { |line| lines << line } 

但接下来我该怎么办?

谢谢!

如果回答@mudasobwa问题“你想抓住所有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 /\w{1} 88/ res << "#{current_head}, #{line}" end end puts res 

我已将您的数据写入’temp’文件:

首先定义一个正则表达式,用于提取感兴趣的文件行。

 r = / Head\s+\d+ # match 'Head', > 0 spaces, ?= 1 digits in capture group 1 | # or [[:lower:]]+\s+88 # match > 0 lower case letters, > 0 spaces, '88' /xm # free-spacing regex definition and multi-line modes 

现在对该文件执行以下操作。

 File.read('temp').scan(r). slice_before { |line| line.start_with?('Head ') }. reject { |a| a.size == 1 }. flat_map { |head, *rest| [head].product(rest) }. map { |a| "%s, %s" % a } #=> ["Head 1, f 88", "Head 4, t 88", "Head 33, v 88", # "Head 32, n 88", "Head 32, b 88"] 

步骤如下。

 a = File.read('temp').scan(r) #=> ["Head 1", "f 88", "Head 4", "t 88", "Head 53", "Head 33", # "v 88", "Head 32", "n 88", "b 88"] b = a.slice_before { |line| line.start_with?('Head') } #=> #:each> 

我们可以通过将枚举器转换为数组来查看枚举器生成的元素。

 b.to_a #=> [["Head 1", "f 88"], ["Head 4", "t 88"], ["Head 53"], # ["Head 33", "v 88"], ["Head 32", "n 88", "b 88"]] 

现在从b删除所有大小为1的数组。

 c = b.reject { |a| a.size == 1 } #=> [["Head 1", "f 88"], ["Head 4", "t 88"], ["Head 33", "v 88"], # ["Head 32", "n 88", "b 88"]] 

接下来,我们使用Enumerable#flat_map和Array#product将每个“Head”与后面的所有行相关联(在文件的下一个“Head”或末尾之前),即88\n

 d = c.flat_map { |head, *rest| [head].product(rest) } #=> [["Head 1", "f 88"], ["Head 4", "t 88"], ["Head 33", "v 88"], # ["Head 32", "n 88"], ["Head 32", "b 88"]] 

最后,将d每个元素转换为字符串。

 d.map { |a| "%s, %s" % a } #=> ["Head 1, f 88", "Head 4, t 88", "Head 33, v 88", # "Head 32, n 88", "Head 32, b 88"]