Расщепление в рубине из файла - PullRequest
2 голосов
/ 02 марта 2011

При чтении из файла мне нужно разбить его на более мелкие части.

По сути, файл выглядит так:

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 ]

1 голос
/ 02 марта 2011

Вы можете разделить строку с положительным прогнозным утверждением нулевой ширины, а затем просто #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"]]
1 голос
/ 02 марта 2011

Чтобы просто получить числа, используйте scan вместо split.

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

Чтобы также получить текст между ними, вы можете использовать разделение с предвкушением:

chunk = fread.split(/\n(?=[0-9])/)
0 голосов
/ 02 марта 2011

Если количество тестов различно, используйте 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"]
...