2011-03-01 60 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"]