2011-03-01 57 views
2

從文件中讀取時,我需要能夠將它分塊成更小的塊。從文件中分割紅寶石

基本上文件看起來像這樣:

6057493131 
    Test 1 
    Test 2 
    Test 3 
6057493132 
    Test 1 
    Test 2 
    Test 3 
6057493133 
    Test 1 
    Test 2 
    Test 3 
6057493134 
    Test 1 
    Test 2 
    Test 3 

我需要它每次分割出一個新numberseries開始。
我已經使用此代碼:

f = File.open("test.txt") 
    fread = f.read 
    chunk = fread.split(/^[0-9]/) 
puts chunk[0...3] 

它的工作原理,但令人沮喪的足夠的第一個數字是丟失。恩。 「6057493132」變成「057493132」 如何獲得所有數字,或者有關如何做的更好的想法?

回答

1

若要獲取數字使用scan而不是拆分。

chunk = fread.scan(/^[0-9]+/) 

也得到之間,您可以使用拆分與前瞻文字:

chunk = fread.split(/\n(?=[0-9])/) 
+0

謝謝,我現在得到整數,但我也需要(例如chunk [0])所有的信息到下一個數字(測試1,測試2,測試3等)。 – Johnny 2011-03-01 21:28:10

1

你可以字符串以零寬度正預測先行斷言每個拆分,然後就#to_a元件。這會給你一個「二維」數組,每行都是一組。

require 'pp' 
pp(IO.read('split.txt').split(/(?=^\d)/).map(&:to_a)) 

[["6057493131\n", " Test 1\n", " Test 2\n", " Test 3\n"], 
["6057493132\n", " Test 1\n", " Test 2\n", " Test 3\n"], 
["6057493133\n", " Test 1\n", " Test 2\n", " Test 3\n"], 
["6057493134\n", " Test 1\n", " Test 2\n", " Test 3\n"]] 
0

如果有不同數量的測試,請使用DigitalRoss。如果總是有三個,看看這個:

ar = DATA.map{|line|line.strip} # puts all in an array, getting rid of the whitespace 
ar.each_slice(4){ |number, *tests| puts "Run #{number} has #{tests.inspect}" } 

__END__ 
6057493131 
    Test 1 
    Test 2 
    Test 3 
6057493132 
    Test 1 
    Test 2 
    Test 3 
6057493133 
    Test 1 
    Test 2 
    Test 3 
6057493134 
    Test 1 
    Test 2 
    Test 3 

__END__之後的東西被視爲一個名爲DATA的文件。輸出:

Run 6057493131 has ["Test 1", "Test 2", "Test 3"] 
Run 6057493132 has ["Test 1", "Test 2", "Test 3"] 
Run 6057493133 has ["Test 1", "Test 2", "Test 3"] 
Run 6057493134 has ["Test 1", "Test 2", "Test 3"]