[英]Printing an Array as a table in Ruby
我當前的代碼是...
print_line
processes = @client.sys.process.get_processes
blacklist = ["NT AUTHORITY\\SYSTEM", "NT AUTHORITY\\LOCAL SERVICE", "NT AUTHORITY\\NETWORK SERVICE"]
filtered = processes.map!{|i| i.slice!("arch", "session", "path")}.reject {|h| blacklist.include? h['user']}
filtered.each do |r|
puts r.map { |p| p}.join(" ")
end
這是輸出...
pid 0 ppid 0 name [System Process] user
pid 456 ppid 320 name explorer.exe user CLINE\Administrator
pid 544 ppid 204 name TPAutoConnect.exe user CLINE\Administrator
pid 1096 ppid 456 name vmtoolsd.exe user CLINE\Administrator
pid 180 ppid 456 name rundll32.exe user CLINE\Administrator
pid 1208 ppid 724 name logon.scr user CLINE\Administrator
這是數組...
[*] [{"pid"=>0, "ppid"=>0, "name"=>"[System Process]", "user"=>""}, {"pid"=>456, "ppid"=>320, "name"=>"explorer.exe", "user"=>"CLINE\\Administrator"}, {"pid"=>544, "ppid"=>204, "name"=>"TPAutoConnect.exe", "user"=>"CLINE\\Administrator"}, {"pid"=>1096, "ppid"=>456, "name"=>"vmtoolsd.exe", "user"=>"CLINE\\Administrator"}, {"pid"=>180, "ppid"=>456, "name"=>"rundll32.exe", "user"=>"CLINE\\Administrator"}, {"pid"=>1208, "ppid"=>724, "name"=>"logon.scr", "user"=>"CLINE\\Administrator"}]
但我希望輸出像表格一樣
pid ppid name user
1 0 x.exe me
2 1 y.exe you
我的代碼中缺少什么?
您可以使用sprintf
打印固定寬度的列。 首先獲取每列的最大長度,然后使用sprintf並使用"\\t"
所有值:
max_length = filtered.inject({}) {|m,e| e.each{|key,value| m[key] = [key.length, m[key].to_i, value.to_s.length].max}; m}
puts filtered.collect{|e| e.collect{|key,value| sprintf("%#{max_length[key]}s", value)}.join("\t")}
更新:要打印出標題,可以使用以下內容
左對齊:
max_length.collect{|key, value| sprintf("%-#{value}s", key)}.join("\t")
右對齊:
max_length.collect{|key, value| sprintf("%#{value}s", key)}.join("\t")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.