从文件中读取时,我需要能够将其分成更小的部分。
基本上文件看起来像这样:
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” 如何获得所有数字,或者如何更好地了解如何做到这一点?
答案 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"]