web-dev-qa-db-ja.com

ハッシュをきれいに印刷する最良の方法

ネストされた配列とハッシュを持つ大きなハッシュがあります。ユーザーが「読みやすい」ように単純に印刷したいと思います。

To_yamlのようなものにしたいと思います-それはかなり読みやすいですが、それでも技術的に見過ぎです。

最終的には、これらのデータチャンクを読み取る必要があるエンドユーザーになるため、きれいにフォーマットする必要があります。

助言がありますか?

157
Adam O'Connor
require 'pp'
pp my_hash

組み込みのソリューションが必要で、適切な改行が必要な場合は、 pp を使用します。

Gemをインストールできる場合は、 awesome_print を使用します。 (ユーザーによっては、index:falseオプションを使用して配列インデックスの表示をオフにすることもできます。)

229
Phrogz

JSONをお持ちの場合は、 awesome_print より簡単で、preタグで見栄えがよく、Webページから簡単にコピーできるため、JSON.pretty_generate(hash)をお勧めします。 (参照: JSON出力をRuby on Railsで「きれいに」フォーマットするにはどうすればよいですか?

79
David J.

ppawesome_printよりもうまく機能する別のソリューション:

require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
23
Alex D

派手なgemアクションはないがJSONは持っている場合、このCLI行はハッシュで動作します:

puts JSON.pretty_generate(my_hash).gsub(":", " =>")

#=>
{
  :key1 => "value1",

  :key2 => "value2",

  :key3 => "value3"
}
13
Nick Schwaderer

ユーザーに印刷する場合は、上記の回答を使用してください。

コンソールで自分用に印刷するだけなら、irbの代わりにpry gemを使用することをお勧めします。プリティ印刷の他に、pryには他にも多くの機能があります(以下のrailscastを確認してください)

gem install pry

そして、このrailscastを確認してください:

http://railscasts.com/episodes/280-pry-with-Rails

4
Abdo

私が試したすべてのgemのうち、show_data gemが最適でした。今では、Railsのパラメーターハッシュのログ記録に広く使用しています

1
Dr.Strangelove

Pryを使用する場合、次のコードを〜/ .pryrcに追加するだけです。

require "awesome_print"
AwesomePrint.pry!
1
bartoindahouse

ネストされた大きなハッシュの場合、このスクリプトが役立ちます。コピーしやすくするために、インデントのみのある素敵な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)です。

0
swilgosz

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からの応答を解析します)

0
Adobe

キーが正常であると信頼している場合、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
}
0
grosser