ruby - bonita impresión a un archivo en rubí
file-io pretty-print (7)
¿Qué pasa con (no usar pp directamente):
File.open("myfile.out","w+") do |f|
f.puts mymap.inspect
end
O incluso redirigir stdout para el archivo
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
Estoy intentando imprimir bastante un hash a un archivo.
Intenté redirecciones de Unix [agregué banderas diferentes a él de forma incremental]:
`echo #{pp mymap} | tee summary.out 2>&1`
y archivo IO
my_file = File.new(@dir_+"/myfile.out",''w+'')
my_file.puts `#{pp get_submap_from_final(all_mapping_file,final_map)}`
Siempre imprime en la consola y no escribe en un archivo.
También tiene que haber una manera más fácil de escribir en el archivo en una línea en ruby? en lugar de hacer File.new y luego escribir en un archivo?
Aquí hay una expansión de la publicación anterior para imprimir bastante bien el archivo json en un archivo.
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
Dado el mymap
de la pregunta, puede usar la gema "show_data" , que proporciona dos métodos: show_data
y format_data
. Este último produce una cadena "bastante impresa" de su argumento que luego puede alimentar a cualquier método de salida.
require ''show_data''
$stderr.puts format_data(mymap)
Por ejemplo:
myhash = { ''owners'' => 21050, ''users'' => 16877, ''portfolios'' => 583,
''properylists'' => 0, ''properties'' => 29504, ''units'' => 62688,
''tenants'' => 85856 }
$stderr.puts format_data(myhash)
en STDERR:
{ ''owners'' => 21050,
''users'' => 16877,
''portfolios'' => 583,
''properylists'' => 0,
''properties'' => 29504,
''units'' => 62688,
''tenants'' => 85856
}
El uso de backticks aquí es desconcertante ya que se usan para ejecutar comandos de shell.
Lo que probablemente quieras decir es:
File.open(@dir_+"/myfile.out",''w+'') do |f|
f.write(pp(get_submap_from_final(all_mapping_file,final_map)))
end
El método pp
siempre escribe en la consola para que pueda verlo y aún tenerlo escrito.
Hacer algo similar a lo que sugirió Edu y ¿Cómo puedo redireccionar stderr y stdout al archivo para un script de Ruby? ayudado.
Así es como el nuevo código es similar a:
$stdout.reopen(@dir_+"/my_file.out",''w+'')
puts "All metrics are:"
pp final_map
$stdout=STDOUT
Todavía estaría interesado en saber por qué los operadores de redirección> y 2> y 1 en los tic-back no funcionan
require ''pp''
File.open("test.txt","w") do |f|
PP.pp(self,f)
end
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