2014-09-26 81 views
0

我有一個TSV文件,其中有一列。在那一欄是一堆數字。該列有一個標題。將TSV文件中的數字放入數組中

什麼是最有效的方式來獲得該列中的所有數字到一個數組? (比如說200萬個數字)。

示例數據:

 
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 2014-09-26 18:53:19

+0

我們需要查看示例數據,以及所需輸出的示例,以及顯示您已嘗試過的代碼。 – 2014-09-26 18:55:28

+0

你需要這些數字是「數字」(Fixnum類)還是它們可以是字符串? – lcguida 2014-09-26 19:05:03

回答

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 > '' 

用於避免在輸入文件包含尾隨/終止行尾時追加空/空行。

相關問題