やりたいことをするのに派手な正規表現は必要ありません。それをどうやってやるのかを知る必要があります。
RubyのEnumerableにはslice_before
、配列内のどの要素がグループ化されているかを判別するために使用される正規表現をとるというメソッドがあります。配列はそれをEnumerableから継承します。例えば:
text = '#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET
#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET
Scratch Reason - Reason Unavailable changed to Trainer 2:19 PM ET
'
data = text.split("\n").slice_before(/\A\S/).to_a
require 'pp'
pp data
出力:
[["#3\tHello Stormy\tScratched\t-\tReason Unavailable\t\t\t11:10 AM ET"],
["#3\tHello Stormy\tScratched\t-\tReason Unavailable\t\t\t11:10 AM ET",
"\t\t\tScratch\tReason\t-\tReason Unavailable changed to Trainer\t2:19 PM ET"]]
つまり、テキストを分割して作成された配列"\n"
は、パターンである空白で始まらない行でグループ化されます/\A\S/
。すべての単一行は別々のサブ配列にあります。前の行の続きである行は、その行とグループ化されます。
ディスクからファイルを読み取る場合はIO.readlines
、ファイルを配列として読み取るために使用でき、ファイルを分割する必要がありません。
必要に応じて、次のようなものを使用して、その配列をさらに処理し、行と継続行を再構築できます。
data = text.split("\n").slice_before(/\A\S/).map{ |i| i.join("\n") }
これは次のようになりdata
ます。
["#3\tHello Stormy\tScratched\t-\tReason Unavailable\t\t\t11:10 AM ET",
"#3\tHello Stormy\tScratched\t-\tReason Unavailable\t\t\t11:10 AM ET\n\t\t\tScratch\tReason\t-\tReason Unavailable changed to Trainer\t2:19 PM ET"]
各行をそのコンポーネントフィールドに分割する必要がある場合は、を使用しますsplit("\t")
。サブアレイ全体でそれを行う方法は、演習として残されていますが、私は関与しmap
ます。
編集:
...私はあなたのソリューションが好きですが、slice_beforeの未定義のメソッドを取得しています。
これを試して:
require 'pp'
require 'rubygems'
class Array
unless Array.respond_to?(:slice_before)
def slice_before(pat)
result = []
temp_result = []
self.each do |i|
if (temp_result.empty?)
temp_result << i
next
end
if i[pat]
result << temp_result
temp_result = []
end
temp_result << i
end
result << temp_result
end
end
end
それを呼び出す:
ary = [
'#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET',
'#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET',
' Scratch Reason - Reason Unavailable changed to Trainer 2:19 PM ET',
]
pp ary.slice_before(/\A\S/)
次のようになります:
[
["#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET"],
["#3 Hello Stormy Scratched - Reason Unavailable 11:10 AM ET",
" Scratch Reason - Reason Unavailable changed to Trainer 2:19 PM ET"]
]