2012-02-10 29 views
21

Estoy tratando de imprimir bastante un hash a un archivo.bonito imprimir en un archivo en ruby ​​

me trataron UNIX redirecciones [banderas diferentes añadidos a la misma de forma incremental]:

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

y el archivo IO

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

Se imprime siempre a la consola y imposible escribir 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?

Respuesta

2

El uso de backticks aquí es desconcertante ya que se usan para ejecutar comandos de shell.

Lo que probablemente quieren 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 a la consola por lo que podría verlo y todavía tienen escrito.

+0

creo que incluso entre comillas sencillas # {} conseguir interpretado por el rubí intérprete. El código que proporcionó sigue emitiendo para la consola, pero no lo escribe en el archivo :( – codeObserver

+0

Se interpreta, sí, pero ¿por qué querría enviar el resultado evaluado al shell? Esa es la parte que no tiene sentido. Recuerde que los palos de atrás son muy similares a 'sistema'. – tadman

+0

eso fue porque pensé que sería capaz de lograr la redirección a un archivo usando> y 2> & 1 ... lo cual no funcionó, así que estaba equivocado, supongo :) ... ¿Cómo puedo redireccionar los pp a un archivo desde f? escribir también no lo hace posible. – codeObserver

1

¿Qué pasa (no usar directamente pp):

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

O incluso redirigir la salida estándar 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 
+0

thankx Edu. inspeccionar se ve elegante, pero lamentablemente no pone una nueva línea después de cada valor clave. ¿Puedes explicar el ejemplo de aproximación estándar? Obtengo asignación de constante dinámica $ stdout = STDOUT = error de archivo ... lamentablemente, no entiendo muy bien qué está sucediendo en el código:) ... – codeObserver

0

Hacer algo similar a lo que sugirió Edu y How do I redirect stderr and stdout to file for a Ruby script? ayudó.

Aquí es cómo 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 qué operadores de redirección> y 2> & 1 en las copias de las garrapatas no funciona

43
require 'pp' 

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

Solo para aclarar, en el ejemplo anterior, se escribiría el valor de "self" al archivo. Si quieres escribir algo más sería PP.pp ('escribir esto en archivo', f) – Usman

-1
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 
-1

Aquí hay una expansión de la publicación anterior para imprimir bastante bien la salida json a 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 
+0

-1 innecesariamente detallado – cwd

0

Dada la mymap de la cuestión, se puede utilizar el "show_data" gem, 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 
} 
Cuestiones relacionadas