ネストされた配列とハッシュを持つ大きなハッシュがあります。ユーザーが「読みやすい」ように単純に印刷したいと思います。
To_yamlのようなものにしたいと思います-それはかなり読みやすいですが、それでも技術的に見過ぎです。
最終的には、これらのデータチャンクを読み取る必要があるエンドユーザーになるため、きれいにフォーマットする必要があります。
助言がありますか?
require 'pp'
pp my_hash
組み込みのソリューションが必要で、適切な改行が必要な場合は、 pp
を使用します。
Gemをインストールできる場合は、 awesome_print を使用します。 (ユーザーによっては、index:false
オプションを使用して配列インデックスの表示をオフにすることもできます。)
JSONをお持ちの場合は、 awesome_print より簡単で、pre
タグで見栄えがよく、Webページから簡単にコピーできるため、JSON.pretty_generate(hash)
をお勧めします。 (参照: JSON出力をRuby on Railsで「きれいに」フォーマットするにはどうすればよいですか? )
pp
やawesome_print
よりもうまく機能する別のソリューション:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
派手なgemアクションはないがJSONは持っている場合、このCLI行はハッシュで動作します:
puts JSON.pretty_generate(my_hash).gsub(":", " =>")
#=>
{
:key1 => "value1",
:key2 => "value2",
:key3 => "value3"
}
ユーザーに印刷する場合は、上記の回答を使用してください。
コンソールで自分用に印刷するだけなら、irbの代わりにpry gemを使用することをお勧めします。プリティ印刷の他に、pryには他にも多くの機能があります(以下のrailscastを確認してください)
gem install pry
そして、このrailscastを確認してください:
私が試したすべてのgemのうち、show_data
gemが最適でした。今では、Railsのパラメーターハッシュのログ記録に広く使用しています
Pryを使用する場合、次のコードを〜/ .pryrcに追加するだけです。
require "awesome_print"
AwesomePrint.pry!
ネストされた大きなハッシュの場合、このスクリプトが役立ちます。コピーしやすくするために、インデントのみのある素敵なpython/like構文でネストされたハッシュを出力します。
module PrettyHash
# Usage: PrettyHash.call(nested_hash)
# Prints the nested hash in the easy to look on format
# Returns the amount of all values in the nested hash
def self.call(hash, level: 0, indent: 2)
unique_values_count = 0
hash.each do |k, v|
(level * indent).times { print ' ' }
print "#{k}:"
if v.is_a?(Hash)
puts
unique_values_count += call(v, level: level + 1, indent: indent)
else
puts " #{v}"
unique_values_count += 1
end
end
unique_values_count
end
end
h = {a: { b: { c: :d }, e: :f }, g: :i }
PrettyHash.call(h)
a:
b:
c: d
e: f
g: i
=> 3
返される値は、ネストされたハッシュのすべてのエンドレベル値のカウント(3)です。
Jsonとrogueを使用したアプローチは次のとおりです。
require 'json'
require 'rouge'
formatter = Rouge::Formatters::Terminal256.new
json_lexer = Rouge::Lexers::JSON.new
puts formatter.format(json_lexer.Lex(JSON.pretty_generate(JSON.parse(response))))
(例えばRestClient
からの応答を解析します)
キーが正常であると信頼している場合、jsonを使用して簡単に実行できます。
JSON.pretty_generate(a: 1, 2 => 3, 3 => nil).
gsub(": null", ": nil").
gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:"). # "foo": 1 -> foo: 1
gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1
{
a: 1,
"2" => 3,
"3" => nil
}