Я написал свои данные в файл «Темп»:
Сначала следует определить регулярное выражение для извлечения строк файла, которые представляют интерес.
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') }
#=> #<Enumerator: #<Enumerator::Generator:0x007ffd218387b0>:each>
Мы можем увидеть элементы, которые будут генерироваться счетчику b
путем преобразования его в массив.
b.to_a
#=> [["Head 1", "f 88"], ["Head 4", "t 88"], ["Head 53"],
# ["Head 33", "v 88"], ["Head 32", "n 88", "b 88"]]
Теперь удалите все массивы размером 1 с b
.
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» или конца файла), что в конечный 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"]
Вы хотите получить все, что имеет значение «88»? Это непонятно из вопроса. Также, пожалуйста, покажите нам, что вы уже пробовали. – mudasobwa
@il_raffa Спасибо за редактирование – Misha1991
@Mudasobwa Да, я хочу выбрать все записи с 88 и их заголовками – Misha1991