漂亮打印到ruby中的文件

我试图将哈希打印到文件。

我尝试了unix重定向[逐步添加不同的标志]:

`echo #{pp mymap} | tee summary.out 2>&1` 

和文件IO

  my_file = File.new(@dir_+"/myfile.out",'w+') my_file.puts `#{pp get_submap_from_final(all_mapping_file,final_map)}` 

它总是打印到控制台并且不写入文件。

还有一种更简单的方法可以在ruby中的一行中写入文件吗? 而不是做File.new,然后写入文件?

 require 'pp' File.open("test.txt","w") do |f| PP.pp(self,f) end 

这里使用反引号是令人困惑的,因为它们用于执行shell命令。

你可能的意思是:

 File.open(@dir_+"/myfile.out",'w+') do |f| f.write(pp(get_submap_from_final(all_mapping_file,final_map))) end 

pp方法总是写入控制台,因此您可能会看到它并仍然编写它。

怎么样(不直接使用pp):

 File.open("myfile.out","w+") do |f| f.puts mymap.inspect end 

甚至重定向stdout文件

 file = File.open("myfile.out", "w+) old_stdout = STDOUT $stdout = STDOUT = file pp get_submap_from_final(all_mapping_file,final_map) $stdout = STDOUT = old_stdout 

做类似于Edu建议的事情, 如何将stderr和stdout重定向到文件以获取Ruby脚本? 帮助。

以下是新代码的类似方式:

 $stdout.reopen(@dir_+"/my_file.out",'w+') puts "All metrics are:" pp final_map $stdout=STDOUT 

仍然有兴趣知道为什么重定向运算符>,并且反向标记中的2>&1不起作用

根据问题的mymap ,您可以使用“show_data”gem ,它提供两种方法: show_dataformat_data 。 后者生成一个“漂亮打印”的参数字符串,然后可以将其输入任何输出方法。

 require 'show_data' $stderr.puts format_data(mymap) 

例如:

 myhash = { 'owners' => 21050, 'users' => 16877, 'portfolios' => 583, 'properylists' => 0, 'properties' => 29504, 'units' => 62688, 'tenants' => 85856 } $stderr.puts format_data(myhash) 

在STDERR上:

  { 'owners' => 21050, 'users' => 16877, 'portfolios' => 583, 'properylists' => 0, 'properties' => 29504, 'units' => 62688, 'tenants' => 85856 } 
 require 'pp' class File def pp(*objs) objs.each {|obj| PP.pp(obj, self) } objs.size <= 1 ? objs.first : objs end end File.open('output','w') do |file| file.pp mymap end 

这是对上面的post的扩展,也是对文件的漂亮打印json输出。

 require "pp" require "json" class File def pp(*objs) objs.each {|obj| PP.pp(obj, self) } objs.size <= 1 ? objs.first : objs end def jj(*objs) objs.each {|obj| obj = JSON.parse(obj.to_json) self.puts JSON.pretty_generate(obj) } objs.size <= 1 ? objs.first : objs end end test_object = { :name => { first: "Christopher", last: "Mullins" }, :grades => [ "English" => "B+", "Algebra" => "A+" ] } test_json_object = JSON.parse(test_object.to_json) File.open("log/object_dump.txt", "w") do |file| file.pp(test_object) end File.open("log/json_dump.txt", "w") do |file| file.jj(test_json_object) end