2012-05-06 49 views
0

我在试着解决我遇到的一个问题,即使用我最新的项目之一。这里是senario:将哈希写入CSV文件,然后将值读回以形成哈希值

我打电话给GoToWebinar API来获取即将到来的网络研讨会。一切工作正常和网络研讨会在哈希的就是这样的形式获取:

[ 
{ 
"webinarKey":5303085652037254656, 
"subject":"Test+Webinar+One", 
"description":"Test+Webinar+One+Description", 
"times":[{"startTime":"2011-04-26T17:00:00Z","endTime":"2011-04-26T18:00:00Z"}] 
}, 
{ 
"webinarKey":9068582024170238208, 
"name":"Test+Webinar+Two", 
"description":"Test Webinar Two Description", 
"times":[{"startTime":"2011-04-26T17:00:00Z","endTime":"2011-04-26T18:00:00Z"}] 
} 
] 

我创建了我们要每天跑一次填充CSV本哈希,然后提交rake任务在控制器操作中读取CSV文件以填充视图。

这里是我的代码填充CSV文件:

g = GoToWebinar::API.new() 
@all_webinars = g.get_upcoming_webinars 
CSV.open("#{Rails.root.to_s}/public/upcoming_webinars.csv", "wb") do |csv| 
    @all_webinars.each do |webinar| 
    webinar.to_a.each {|elem| csv << elem} 
    end 
end 

我需要想办法来保存的散列在这样一个被保存在CSV文件的形式接收信息的某些帮助保存顺序的方式,也是一种从CSV文件中读取信息的方式,它以相同的方式在控制器操作中填充哈希值。

+1

CSV和哈希试图完成两件不同的事情,所以它们不会真正地来回翻译。例如,散列中“times”的值就是它自己和另一个散列的数组;这意味着您要将每个项目放入CSV(一层深度数据结构)至少要深入三层。有没有理由不能将散列保存为JSON文件并将其读回?否则,你需要将散列分开并将值映射到CSV中的特定列,这将非常脆弱。 – farski

+0

首先,你谈论的散列是一个JSON字符串,而不是一个Ruby散列。将字符串保存为JSON文件中的JSON字符串,或者将其转换为Ruby哈希和marshal对象,然后将结果字符串存储到文件中。在阅读文件时,您需要“解除”导致Ruby哈希的字符串。 [Ruby编组](http://www.ruby-doc.org/core-1.9.3/Marshal.html) – Kashyap

回答

0

从我从所有示例中学到的知识和完成此工作所做的工作我认为,绕过此类功能的最佳方法是创建一个rake任务并使用该信息填充数据库并使用这些信息保存以填充视图。

0

您希望使用散列键(因为它们是常量)作为CSV文件的标题。然后像你一样推动每个元素。

g = GoToWebinar::API.new() 
@all_webinars = g.get_upcoming_webinars 
headers= @all_webinars.keys 
CSV.open("#{Rails.root.to_s}/public/upcoming_webinars.csv", "wb", headers: headers) do |csv| 
    @all_webinars.each do |webinar| 
    webinar.to_a.each {|elem| csv << elem} 
    end 
end 

但是,您要确保散列值中的任何数据都是平坦的。需要处理数组内的哈希时间(可能只是删除时间并在哈希中有startTime和endTime键)。

0

这篇关于Ruby序列化和Alan Skorkin反序列化的文章可能会有所帮助。 Link here