2014-09-26 2 views
0

У меня есть файл TSV с одним столбцом в нем. В этой колонке есть куча чисел. Столбец имеет заголовок.Поместите числа из файла TSV в массив

Каков наиболее эффективный способ получить все числа в этом столбце в один массив? (скажем, как 2 000 000 номеров).

Пример данные:

 
income 
2000\n 
80000\n 
50000\n 
30000\n 

я пытался:

File.readlines(path)[1..-1].collect{|salary| salary.gsub("\n",'')} 

Я хочу иметь следующий вывод:

[2000,80000,50000,30000] 

Что я имею дело, но я не уверен, это наиболее эффективно, потому что я буду читать миллион строк в памяти.

+0

Как насчет кода того, что вы уже пробовали? – lcguida

+0

Нам нужно увидеть образцы данных и пример желаемого результата, а также код, показывающий, что вы уже пробовали. –

+0

Вам нужно, чтобы эти числа были «числами» (класс Fixnum), или они могут быть String? – lcguida

ответ

1

Вы можете использовать CSV для этого, и это очень просто, потому что у вас есть только один столбец.

require 'csv' 
CSV.read("/path/to/file.tsv").flatten 
0

Вы можете сделать что-то вроде:

array = [] 
File.foreach('test.txt') do |line| 
    next if $. == 1 
    line.chomp! 
    array << line if line > '' 
end 

p array 

который возвращает array как:

["2000", "80000", "50000", "30000"] 

Однако, это вряд ли масштабируемое решение. В зависимости от вашего устройства у вас может закончиться нехватка памяти и приложить приложение к обходу. Вместо этого я настоятельно рекомендую использовать простую базу данных для хранения значений, а затем работать с ней. Базы данных предназначены для такого рода целей и могут быть чрезвычайно быстрыми. Я рекомендую использовать для этого драгоценный камень Sequel.

$. это специальная переменная, которая используется для отслеживания номер строки последнего файла для чтения, так как foreach проходит строки в блоке, $. будет увеличиваться. Это позволяет пропустить определенную линию легко.

array << line if line > '' 

используется, чтобы избежать добавления пустых/пустых строк, если входной файл содержит завершающий/завершающий конец строки.

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