我在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万条记录。
答案 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