2013-04-17 2 views
2

У меня есть файл с десятью отдельными столбцами данных, разделенных пробелами. Я написал следующий код (и это работает), но я чувствую, что есть более простой способ сделать то, что я делаю здесь:Ruby novice: Написание метода для чтения массивов mulitple из файла?

#Generate ten separate arrays in which to store the columns 
c0 = []; c1 = []; c2 = []; c3 = []; c4 = []; 
c5 = []; c6 = []; c7 = []; c8 = []; c9 = []; 

#Append each item in each line to its own array 
File.open(filename, 'r').each_line do |line| 
    line = line.strip.split(' ') 
    c0 << line[0]; c1 << line[1]; c2 << line[2]; c3 << line[3]; c4 << line[4]; 
    c5 << line[5]; c6 << line[6]; c7 << line[7]; c8 << line[8]; c9 << line[9]; 
end 

Я попытался написать метод для выполнения этой задачи, но я я совершенно не знаю, с чего начать. Я предполагаю, что существует более чистый способ инициализации n-ряда массивов, чем то, как я это сделал ... что такое «рубиновый» способ сделать это? Можно ли делать все, что я делаю здесь, в одном методе, который возвращает 10 массивов? Помощь/подсказки о том, как это сделать, будут очень признательны.

ответ

1
File.open(filename, 'r') do |infile| 
    c = infile.lines.map(&:split).transpose 
end 

Теперь c является двумерный массив, где каждая строка представляет собой массив, представляющий столбец из исходного файла, поэтому c[0] = c0 и так далее.

EDIT: Это, вероятно, немного плотно. Некоторое объяснение:

infile.lines - массив, в котором каждый элемент является строкой из файла.

infile.lines.map(&:split) не подходит для infile.lines.map { |line| line.split }.

' ' - это символ по умолчанию, который необходимо разбить.

transpose превращает столбцы в строки.

+0

Я пробовал это в нескольких отдельных файлах. Я получил следующую ошибку: test.rb: 7: in 'transpose ': размер элемента отличается (10 должно быть 9) (IndexError). Есть идеи? – aneuch2

+0

test.rb: 7: in 'transpose ': размер элемента отличается (0 должно быть 6) (IndexError) Это ошибка, возвращаемая в файл с 6 столбцами. – aneuch2

+0

Попробуйте это без транспонирования и посмотрите, что вы получаете. Длина каждого массива должна быть одинаковой. – seph

2

Может быть, этот кусок кода помогает:

c = [] 
    File.open(filename, 'r').each_line do |line| 
     line = line.strip.split(' ') 
     columns = Hash.new 
     index=0 
     line.each do |column| 
     columns[index] = column 
     index+=1 
     end 
     c.push(columns) 
    end 

Где каждый столбец является Hash с индексом по линейной части, и все строки сохраняются в массиве

+0

Что именно? Я получаю неопределенную переменную ошибку. Извините, я рубин и программирование noob (и у меня мало опыта работы с хэшами). Благодаря! – aneuch2

+0

извините, строка: columns [index] = column. –

+0

Это работает сейчас, спасибо. – aneuch2

Смежные вопросы