从文件分裂红宝石

时间:2011-03-01 21:19:37

标签: ruby file split

从文件中读取时,我需要能够将其分成更小的部分。

基本上文件看起来像这样:

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

每当新的数据开始时我都需要它分开 我使用这段代码:

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

它有效,但令人沮丧的是第一个号码丢失了。恩。 “6057493132”变为“057493132” 如何获得所有数字,或者如何更好地了解如何做到这一点?

3 个答案:

答案 0 :(得分:1)

要使用scan而不是分割来获取数字。

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

要同时获取文本,您可以使用前瞻分割:

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

答案 1 :(得分: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"]]

答案 2 :(得分: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"]