2012-02-10 4 views
21

Я пытаюсь довольно печатать хэш в файл.довольно печатать в файл в ruby ​​

Я попытался 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.new, а затем записывать в файл?

ответ

2

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

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

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

Метод pp всегда пишет в консоль, чтобы вы могли видеть его и до сих пор он написал.

+0

Я думаю, что даже в кавычку # {} интерпретируются интерпретатором рубина. Код, который вы дали, все же выводится на консоль, но не записывает в файл :( – codeObserver

+0

Он интерпретируется, да, но зачем вы хотите отправить оцениваемый результат в оболочку? Это та часть, которая не имеет смысла. Помните, что обратные такты очень похожи на 'систему'. – tadman

+0

, потому что я думал, что смогу добиться перенаправления на файл с помощью> и 2> и 1 .., который не работал, поэтому я ошибся, я думаю :) .. Как мне получить перенаправление pp в файл с f. писать тоже не делает это. – codeObserver

1

насчет (не используя п.п. непосредственно):

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

thankx Edu. проверка выглядит элегантно, но, к сожалению, она не помещает новую строку после каждого значения ключа. Не могли бы вы объяснить пример подхода stdout. Я получаю динамическое постоянное назначение $ stdout = STDOUT = ошибка файла .. alas также не совсем понимают, что происходит в коде:) ... – codeObserver

0

Doing нечто похожее на то, что предложил Эду и How do I redirect stderr and stdout to file for a Ruby script? помогли.

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

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

ли еще будет интересно узнать, почему операторы перенаправления> и 2> & 1 в бэк-тиков не работает

43
require 'pp' 

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

Просто пояснить. В приведенном выше примере значение «self» будет записано к файлу. Если вы хотите написать что-то еще. это будет PP.pp («напишите это в файл», 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

Это расширение к сообщению выше, чтобы также распечатать вывод 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

-1 излишне подробный – cwd

0

Учитывая mymap от вопроса, вы можете использовать "show_data" gem, который предусматривает два метода: 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 
} 
Смежные вопросы