красивая печать в файл в рубине - PullRequest
22 голосов
/ 11 февраля 2012

Я пытаюсь напечатать хеш в файл.

Я пробовал перенаправления Unix [добавляли различные флаги к нему постепенно]:

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

и File IO

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

Он всегда печатает на консоль и не пишет вfile.

Также должен быть более простой способ записи в файл одной строкой в ​​ruby?вместо того, чтобы делать File.new и затем записывать в файл?

Ответы [ 7 ]

48 голосов
/ 07 апреля 2012
require 'pp'

File.open("test.txt","w") do |f|
  PP.pp(self,f)
end
2 голосов
/ 11 февраля 2012

Использование обратных галочек здесь вызывает недоумение, поскольку они используются для выполнения команд оболочки.

Что вы, вероятно, имеете в виду:

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

Метод pp всегда записывает в консольтак что вы можете увидеть это и все еще написать.

1 голос
/ 11 февраля 2012

Как насчет (без непосредственного использования pp):

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

Или даже перенаправить стандартный вывод для файла

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 голосов
/ 23 апреля 2014

Учитывая mymap из вопроса, вы можете использовать гем "show_data" , который предоставляет два метода: show_data и format_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
}
0 голосов
/ 23 декабря 2012

Вот расширение к посту выше, чтобы также распечатать вывод 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
0 голосов
/ 11 октября 2012
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
0 голосов
/ 11 февраля 2012

Делать что-то похожее на то, что предложил Edu и Как перенаправить stderr и stdout в файл для сценария Ruby? помогло.

Вот как новый код похож на:

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

Было бы интересно узнать, почему не работают операторы перенаправления>, и 2> & 1 в обратных тиках

...