我寫你的數據文件「臨時」:
首先定義用於提取感興趣的文件的行正則表達式。
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"]]
現在從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每個「頭」與以下所有線路爲此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