以下列格式给出逗号分隔的CSV文件:
Day,User,Requests,Page Views,Browse Time,Total Bytes,Bytes Received,Bytes Sent
"Jul 25, 2012","abc123",3,0,0,13855,3287,10568
"Jul 25, 2012","abc230",1,0,0,1192,331,861
"Jul 25, 2012",,7,0,0,10990,2288,8702
"Jul 24, 2012","123456",3,0,0,3530,770,2760
"Jul 24, 2012","abc123",19,1,30,85879,67791,18088
我想将整个数据集(超过30天的1000个用户= 30,000条记录)放入散列中,使得密钥1可以是重复密钥,密钥2可以是重复密钥,但是密钥1和密钥1。 2将是独一无二的。
使用上面第1行的示例:
report_hash =“2012年7月25日”=> “abc123”=> {“PageRequest”=> 3,“PageViews”=> 0,“BrowseTime”=> 0,“TotalBytes”=> 13855,“BytesReceived”=> 3287,“BytesSent”=> 10568}
def hashing(file)
#read the CSV file into an Array
report_arr = CSV.read(file)
#drop the header row
report_arr.drop(1)
#Create an empty hash to save the data to
report_hash = {}
#for each row in the array,
#if the first element in the array is not a key in the hash, make one
report_arr.each{|row|
if report_hash[row[0]].nil?
report_hash[row[0]] = Hash.new
#If the key exists, does the 2nd key exist? if not, make one
elsif report_hash[row[0]][row[1]].nil?
report_hash[row[0]][row[1]] = Hash.new
end
#throw all the other data into the 2-key hash
report_hash[row[0]][row[1]] = {"PageRequest" => row[2].to_i, "PageViews" => row[3].to_i, "BrowseTime" => row[4].to_i, "TotalBytes" => row[5].to_i, "BytesReceived" => row[6].to_i, "BytesSent" => row[7].to_i}
}
return report_hash
end
我花了几个小时学习哈希和相关内容来实现这一目标,但感觉有一种更有效的方法来实现这一目标。有关正确/更有效的创建嵌套哈希方法的建议,前两个键是数组的前两个元素,以便它们创建“复合”唯一键?
答案 0 :(得分:2)
您可以使用数组[day, user]
作为哈希键。
report_hash = {
["Jul 25, 2012","abc123"] =>
{
"PageRequest" => 3,
"PageViews" => 0,
"BrowseTime" => 0,
"TotalBytes" => 13855,
"BytesReceived" => 3287,
"BytesSent" => 10568
}
}
您只需确保日期和用户始终显示相同。如果您的日期(例如)有时会以不同的格式显示,则在使用它来读取或写入哈希值之前,您必须对其进行标准化。
类似的方法是将day + user转换为字符串,使用它们之间的某些分隔符。但是你必须更加小心,分隔符不会出现在当天或用户身上。
编辑:
另外,请确保不要修改哈希键。使用数组作为键使得这很容易犯错误。如果您真的想,可以使用dup
修改副本,如下所示:
new_key = report_hash.keys.first.dup
new_key[1] = 'another_user'