2012-02-10 42 views
21

Tôi đang cố gắng in một bản băm vào một tệp.in đẹp vào một tệp trong ruby ​​

tôi đã cố gắng chuyển hướng unix [thêm lá cờ khác nhau để nó từng bước]:

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

và File IO

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

Nó luôn luôn in để an ủi và doesnt viết thư cho một tập tin.

Ngoài ra, phải có cách viết dễ dàng hơn trong một dòng bằng ruby? thay vì làm File.new và sau đó ghi vào một tập tin?

Trả lời

2

Việc sử dụng backticks ở đây là phức tạp vì chúng được sử dụng để thực thi lệnh shell.

Những gì bạn có thể có nghĩa là:

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

Phương pháp pp luôn ghi vào giao diện điều khiển, do đó bạn có thể nhìn thấy nó và vẫn còn có nó bằng văn bản.

+0

Tôi nghĩ rằng ngay cả trong backticks # {} được giải thích bởi ruby ​​thông dịch viên. Mã mà bạn cung cấp vẫn cho kết quả đầu ra cho bàn điều khiển nhưng không ghi vào tệp: ( – codeObserver

+0

Nó được giải thích, có, nhưng tại sao bạn muốn gửi kết quả được đánh giá tới trình bao? Đó là phần không có ý nghĩa. vào 'hệ thống'. – tadman

+0

đó là vì tôi nghĩ rằng tôi có thể đạt được chuyển hướng tới tệp bằng cách sử dụng> và 2> & 1 .. không hoạt động nên tôi đã sai Tôi đoán :) .. Làm cách nào để chuyển hướng trang đến tệp từ f. viết cũng không làm cho nó xảy ra. – codeObserver

1

gì về (không sử dụng pp trực tiếp):

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

Hoặc thậm chí chuyển hướng stdout cho file

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. kiểm tra trông thanh lịch nhưng tiếc là nó không đặt dòng mới sau mỗi giá trị quan trọng. Bạn có thể giải thích ví dụ về cách tiếp cận stdout không. Tôi nhận được chuyển nhượng liên tục năng động $ stdout = STDOUT = lỗi tệp .. cũng không hoàn toàn hiểu những gì đang xảy ra trong mã:) ... – codeObserver

0

Làm một cái gì đó tương tự như những gì Edu đề xuất và How do I redirect stderr and stdout to file for a Ruby script? giúp.

Sau đây là cách mã mới là tương tự như:

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

vẫn sẽ được quan tâm để biết lý do tại sao các nhà khai thác chuyển hướng> và 2> & 1 trong back-ve không hoạt động

43
require 'pp' 

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

Chỉ cần làm rõ, Trong ví dụ trên, giá trị của "tự" sẽ được viết vào tệp. Nếu bạn muốn viết cái gì khác. nó sẽ là PP.pp ('viết này vào tập tin', 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

Đây là bản mở rộng cho bài đăng ở trên cũng để in đầu ra json đẹp vào một tệp.

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 không cần thiết tiết – cwd

0

Với mymap từ câu hỏi, bạn có thể sử dụng "show_data" gem, cung cấp hai phương pháp: show_dataformat_data. Sau đó tạo ra một chuỗi "khá in" của đối số của nó mà sau đó có thể được cung cấp cho bất kỳ phương thức đầu ra nào.

require 'show_data' 

$stderr.puts format_data(mymap) 

Ví dụ:

myhash = { 'owners' => 21050, 'users' => 16877, 'portfolios' => 583, 
      'properylists' => 0, 'properties' => 29504, 'units' => 62688, 
      'tenants' => 85856 } 
$stderr.puts format_data(myhash) 

trên STDERR:

{  'owners' => 21050, 
     'users' => 16877, 
    'portfolios' => 583, 
    'properylists' => 0, 
    'properties' => 29504, 
     'units' => 62688, 
     'tenants' => 85856 
} 
Các vấn đề liên quan