如何解决Ruby-将嵌套哈希转换为CSV
我目前有一个具有以下结构的对象(failure_object):
{“ 2020-08-25” => {“ adwords” => 8,“ analytics” => 69,“ bing” => 5,“ dfa” => 3,“ doubleclick” => 2,“ getstat“ => 2},” 2020-08-26“ => {” adwords“ => 22,” bing“ => 7,” dfa“ => 4,” doubleclick“ => 6,” getstat“ => 2},...
我希望将其写入以下几列的CSV文件中:
+ ------------ + -------------- + ------------- +
| A | B | C |
+ ------------ + -------------- + ------------- +
| 2020-08-25 | adwords | 8 |
| 2020-08-25 |分析| 69 |
| 2020-08-25 |兵5 |
| 2020-08-25 | dfa | 3 |
| 2020-08-25 |双击| 2 |
| 2020-08-25 | getstat | 2 |
| 2020-08-26 | adwords | 22 |
| 2020-08-26 |兵7 |
| 2020-08-26 | dfa | 4 |
| 2020-08-26 |双击| 6 |
| 2020-08-26 | getstat | 2 |
+ --- + -------- + -------------- + ------------- +
到目前为止,我在将红宝石输出到csv方面编写红宝石的经验仅涵盖了数组,尽管我可以将此哈希对象转换为数组,但是键值对之间的关系并没有按照我希望的方式保留。
任何帮助将不胜感激。谢谢。
解决方法
data = {
"2020-08-25"=>{ "adwords"=>8,"analytics"=>69,"bing"=>5,"dfa"=>3,"doubleclick"=>2,"getstat"=>2 },"2020-08-26"=>{ "adwords"=>22,"bing"=>7,"dfa"=>4,"doubleclick"=>6,"getstat"=>2 }
}
从除CSV对象之外的其他对象写入CSV文件时(例如,在读取要更改的CSV文件时获得),使用CSV方法没有特别的优势。在这里,我们可以编写以下内容。
COL_SEP = '|'
fname = 'tmp.csv'
File.open(fname,'w') do |f|
f.puts 'A|B|C'
data.each { |date,h| h.each { |k,v| f.puts [date,k,v].join(COL_SEP) } }
end
让我们检查一下
puts File.read(fname)
A|B|C
2020-08-25|adwords|8
2020-08-25|analytics|69
2020-08-25|bing|5
2020-08-25|dfa|3
2020-08-25|doubleclick|2
2020-08-25|getstat|2
2020-08-26|adwords|22
2020-08-26|bing|7
2020-08-26|dfa|4
2020-08-26|doubleclick|6
2020-08-26|getstat|2
请参见File::open。通过对块使用open
,文件将在写入后自动关闭。如果我写了f = File.open(fname,'w')
,写完文件后我就需要(记住)用f.close
关闭文件。
另请参阅IO#puts。应该使用puts
代替IO#write,因为它会添加行终止符。回想一下File
是IO
(File.superclass #=> IO
)的子类,因此File
继承了IO
的方法。
要使用CSV方法创建相同的文件,可以编写以下内容。
require 'csv'
CSV.open(fname,'w',col_sep: COL_SEP) do |csv|
csv << ['A','B','C']
data.each { |date,v| csv << [date,v] } }
end
#=> <as above>
如您所见,使用CSV方法几乎没有什么不同。参见CSV::open。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。