从文件中分割红宝石
问题描述:
从文件中读取时,我需要能够将它分块成更小的块。从文件中分割红宝石
基本上文件看起来像这样:
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” 如何获得所有数字,或者有关如何做的更好的想法?
答
若要获取数字使用scan而不是拆分。
chunk = fread.scan(/^[0-9]+/)
也得到之间,您可以使用拆分与前瞻文字:
chunk = fread.split(/\n(?=[0-9])/)
答
你可以字符串以零宽度正预测先行断言每个拆分,然后就#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"]]
答
如果有不同数量的测试,请使用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"]
谢谢,我现在得到整数,但我也需要(例如chunk [0])所有的信息到下一个数字(测试1,测试2,测试3等)。 – Johnny 2011-03-01 21:28:10