2015-09-26 22 views
0

我有一個CSV文件中的列,Original.csv,其中有一堆用戶ID,其中有些重複,像以下:爲什麼哈希內容沒有被保存到CSV文件中?

udid 
d0155049772de9 
8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5 
8b57d8c7f1e5a31e4adaef5fe6c52df1ada7fcd5 
465088425ceb38c62bf8d1d9cc33bcfab4fe4293 
3eabe40461773086 
3eabe40461773086 
e24356719f086021 
212b5b0415560be3 
1c046451a3761ef51fbf52759748f66c98b02313 

我想以後處理它們在MATLAB,所以我想哈希並將它們轉換爲整數並將它們存儲在一個新文件中,New.csv。這是我的代碼:

require 'csv' 

udids = [] 
id=[] 

CSV.foreach('Original.csv', :headers=>true).map do |row| 
    udids << row[0] 
end 

udids=udids.uniq 
arrayHash=[] 

for i in 0..udids.size-1 
    arrayHash<<udids 
    arrayHash<<i 
end 

hash = Hash[arrayHash.each_slice(2).to_a] 

id=hash.values_at *udids 

for i in 0..id.size-1 
    logfile = File.new('New.csv',"w") 
    logfile.print("#{id[i]}\n") 
    logfile.close 
end 

由於某種原因,我沒有能夠搞清楚,該New.csv文件正在運行的代碼之後空。有什麼問題?

編輯:這個程序的散列執行速度比簡單地比較和檢查用戶標識之前是否重複過嗎?像這樣:

CSV.open('New.csv', "wb") do |csv| 
    CSV.foreach('Original.csv', :headers=>true).map do |row| 
    unless udids.include?(row[0]) 
     udids << row[0] 
    end 
    csv<<udids.index(row[56]) + 1 
    end 
end 

在這兩種情況下,你能否說出爲什麼一個人會比另一個更快地執行?如果有問題,我的CSV有6000萬條記錄。

+2

要覆蓋在每個循環迭代的文件。 – Meier

+2

找到一個散列元素會更快,然後找到數組元素,特別是60萬行。但將整個散列保存在內存中可能是一個問題。 – Meier

+1

如果你寫udids.include?它會比較你的元素和6000萬個元素。如果你這樣做6000萬次,你就死了。 – Meier

回答

1

沒有對你完整的代碼更深入的瞭解:

隨着

for i in 0..id.size-1 
    logfile = File.new('New.csv',"w") 
    logfile.print("#{id[i]}\n") 
    logfile.close 
end 

您打開文件id.size-1次,寫一行,並關閉它。最後你有最後一個條目的文件。

看來你想是這樣的

File.open('New.csv',"w") do |logfile| #Open the file 
     id.each{|one_id|    #loop on all ids 
     logfile.print("#{one_id}\n") #write one id in line 
     } 
    end  #Close the file 
相關問題