2013-04-30 3 views
2

У меня есть текстовый файл с этой структурой:Как сохранить каждую строку файла в матрице?

regular: 12/09/2010, 15/09/2012, 16/09/2012 
rewards: 17/09/2010, 18/09/2012, 19/09/2012 
rewards: 20/09/2010, 21/09/2012, 22/09/2012 

И я хочу, чтобы хранить его в матрице, как это:

my_matrix = [['regular', '12/09/2010', '15/09/2012', '16/09/2012'], 
      ['rewards', '17/09/2010', '18/09/2012', '19/09/2012'], 
      ['regular', '20/09/2010', '21/09/2012', '22/09/2012'] 
      ] 

Я попытался это:

File.open(text_file).each_line do |line| 

    @costumer_request = line.delete!(':').split 
    @costumer_request = line.delete!(',').split 

Но он возвращает это: @costumer_request ['regular', '20/09/2010', '21/09/2012', '22/09/2012']

Как я могу это решить?

ответ

3
File.open(text_file){|io| io.each_line.map{|line| line.split(/[:,\s]+/)}} 
+0

Файл должен замкнутыми, вызвав 'File # close' явно или с помощью формы блока' File.open do | f | ... end', который будет закрывать файл неявно. –

+1

@CharlesCaldwell После редактирования, то есть ;-) http://stackoverflow.com/posts/16300619/revisions –

+0

Ваш код производит 'IOError: closed stream' для меня –

2
File.open('foo', 'r') do |f| 
    f.lines.map do |line| 
    line.chomp.split /[:,]/
    end 
end 

#=> [ 
# ["regular", "12/09/2010", "15/09/2012", "16/09/2012"], 
# ["rewards", "17/09/2010", "18/09/2012", "19/09/2012"], 
# ["rewards", "20/09/2010", "21/09/2012", "22/09/2012"] 
#] 
1

Если ваш формат именно тот, который вы показываете вы можете также сделать:

File.open(file).each_line.map do |l| 
    l.split.map { |e| e.chomp(/,:/) } 
end 
+0

'split ('')' эквивалентно просто 'split' ;-) –

+0

@padde, справа, спасибо. – Shoe

+0

Удовлетворительный факт: когда вы действительно хотите разделить * только * в пространствах, вам даже нужно регулярное выражение! Рассмотрим '' a \ tb c \ nd ".split # => [" a "," b "," c "," d "]', который выглядит нормально. Теперь разделим в пространстве: '' a \ tb c \ nd. .split ('') # => ["a", "b", "c", "d"] 'wtf? Нам действительно нужно регулярное выражение: '' a \ tb c \ nd ".split (/ /) # => [" a \ tb "," c \ nd "]' Я нахожу это очень удивительным, и для меня 'split' кажется как-то сломано, пытаясь быть слишком умным. –