在ruby中对文件进行漂亮的打印

在ruby中对文件进行漂亮的打印,ruby,file-io,pretty-print,Ruby,File Io,Pretty Print,我正在尝试将散列打印到文件中 我尝试了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)}` 它总是打印到控制台,而不写入文件 re

我正在尝试将散列打印到文件中

我尝试了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)}`
它总是打印到控制台,而不写入文件

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

另外,在ruby中,必须有一种更简单的方法,在一行中写入文件?不是执行File.new然后写入文件?

这里使用反勾号是令人困惑的,因为它们用于执行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 = 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建议和帮助的事情

以下是新代码的相似之处:

$stdout.reopen(@dir_+"/my_file.out",'w+')
puts "All metrics are:"
pp final_map
$stdout=STDOUT
仍然有兴趣知道为什么重定向操作符>,以及2>&1在后刻度中不起作用

需要“pp”
require 'pp'

File.open("test.txt","w") do |f|
  PP.pp(self,f)
end
类文件 def pp(*objs) objs.each{| obj| PP.PP(obj,self) }
objs.size这里是对上面文章的扩展,也可以将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
需要“pp”
需要“json”
类文件
def pp(*objs)
objs.each{| obj|
PP.PP(obj,self)
}
objs.size[“英语”=>“B+”,“代数”=>“A+”]}
test_json_object=json.parse(test_object.to_json)
打开(“log/object_dump.txt”,“w”)do|文件|
pp文件(测试对象)
结束
打开(“log/json_dump.txt”,“w”)do|文件|
jj(test_json_对象)
结束

给定问题中的
mymap
,您可以使用,它提供了两种方法:
显示\u数据
格式化\u数据
。后者生成其参数的“漂亮打印”字符串,然后可以将该字符串提供给任何输出方法

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)
关于标准:

 {      'owners' => 21050,
         'users' => 16877,
    'portfolios' => 583,
  'properylists' => 0,
    'properties' => 29504,
         'units' => 62688,
       'tenants' => 85856
}

我认为即使在backticks中{}也会被ruby解释器解释。您提供的代码仍然输出到控制台,但不会写入文件:(它会被解释,是的,但是为什么您要将计算结果发送到shell?这是没有意义的部分。请记住反勾号与
系统
非常相似。这是因为我认为我可以使用>和2>&1实现重定向到文件。这不起作用,所以我猜是错的:)…如何使pp重定向到文件,因为f.write也无法实现。thankx Edu.inspect看起来很优雅,但不幸的是,它没有在每个键值后添加新行。请解释一下stdout方法示例。我得到动态常量赋值$stdout=stdout=file error..唉,我也不太明白在这个示例中发生了什么代码:)…只是为了澄清,在上面的示例中,“self”的值将写入文件。如果你想写点别的。它将是PP.PP('将其写入文件',f)
 {      'owners' => 21050,
         'users' => 16877,
    'portfolios' => 583,
  'properylists' => 0,
    'properties' => 29504,
         'units' => 62688,
       'tenants' => 85856
}