为什么散列内容未保存到CSV文件中?

时间:2015-09-26 12:48:13

标签: ruby csv

我在CSV文件Original.csv中有一个列,其中包含一堆用户ID,其中一些重复,如下所示:

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文件为空。有什么问题?

编辑:此程序的散列是否比简单地比较和检查用户ID之前是否重复执行速度更快?像这样:

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万条记录。

1 个答案:

答案 0 :(得分: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