programing

해시를 예쁘게 인쇄하는 가장 좋은 방법

easyjava 2023. 6. 3. 08:52
반응형

해시를 예쁘게 인쇄하는 가장 좋은 방법

중첩된 배열과 해시가 포함된 대용량 해시가 있습니다.사용자가 '읽을 수 있도록' 간단하게 출력하고 싶습니다.

저는 그것이 꽤 읽기 쉽지만, 여전히 너무 기술적으로 보이기를 원합니다.

궁극적으로 이러한 데이터 청크를 읽고 깨끗하게 포맷해야 하는 최종 사용자가 될 것입니다.

좋은 의견이라도 있나?

require 'pp'
pp my_hash

기본 제공 솔루션이 필요하고 합리적인 줄 바꿈을 원하는 경우에 사용합니다.

gem을 설치할 수 있는 경우 awesome_print를 사용합니다. (사용자에 따라 다음을 사용할 수도 있습니다.)index:false배열 인덱스 표시를 해제하는 옵션입니다.)

JSON이 JSON을 합니다.JSON.pretty_generate(hash)awesome_print보다 간단하기 때문에, awesome_print에서 보기 좋습니다.pre태그를 사용하여 웹 페이지에서 쉽게 복사할 수 있습니다.(참고:Ruby on Rails에서 JSON 출력을 "예쁘게" 포맷하려면 어떻게 해야 합니까?)

보다 나에게 더 잘 맞는 다른 .pp또는awesome_print:

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

화려한 보석 액션은 없지만 JSON은 있는 경우 이 CLI 줄은 해시에 대해 작동합니다.

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

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

  :key2 => "value2",

  :key3 => "value3"
}

인 레일즈

필요한 경우

  • "예쁘게 인쇄된" 해시
  • 예: Rails.logger
  • 은 구체적으로 구적으로실, 다은됩니행그것을 합니다.inspect해시에 있는 개체에 대해
    • 당신이 그것을 무시할 때 유용합니다.inspect이 해야 할 .

그러면 이것은 아주 잘 작동합니다! (그리고 더 좋아질수록, 당신의 해시 객체는 더 커지고 더 중첩됩니다.)

logger.error my_hash.pretty_inspect

예:

class MyObject1
  def inspect
    "<#{'*' * 10} My Object 1 #{'*' * 10}>"
  end
end

class MyObject2
  def inspect
    "<#{'*' * 10} My Object 2 #{'*' * 10}>"
  end
end

my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }

Rails.logger.error my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}

# EW! ^

Rails.logger.error my_hash.pretty_inspect
# {:a=>1,
#  :b=><********** My Object 1 **********>,
#  <********** My Object 2 **********>=>3}

pretty_inspect 기본적으로 레일에 포함되는 PrettyPrint에서 제공됩니다.따라서 보석이 필요 없고 JSON으로 변환할 필요가 없습니다.

레일에 없음

레일즈에 있지 않거나 어떤 이유로 위의 작업이 실패할 경우에는require "pp"번째. 첫번째. 예:

require "pp"  # <-----------

class MyObject1
  def inspect
    "<#{'*' * 10} My Object 1 #{'*' * 10}>"
  end
end

class MyObject2
  def inspect
    "<#{'*' * 10} My Object 2 #{'*' * 10}>"
  end
end

my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }

puts my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}

# EW! ^

puts my_hash.pretty_inspect
# {:a=>1,
#  :b=><********** My Object 1 **********>,
#  <********** My Object 2 **********>=>3}

완전한 예

올빅pretty_inspected 검사한 개체의 프로젝트별 텍스트가 수정된 내 프로젝트의 해시 예제

{<***::******************[**:****, ************************:****]********* * ****** ******************** **** :: *********** - *** ******* *********>=>
  {:errors=>
    ["************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
     "************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
     "************ ************ ********** ***** ****** ******** is invalid",
     "************ ************ ********** is invalid",
     "************ ************ is invalid",
     "************ is invalid"],
   :************=>
    [{<***::**********[**:****, *************:**, ******************:*, ***********************:****] :: **** **** ****>=>
       {:************=>
         [{<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ******* ***** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: *** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ********* - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ********** - ********** *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ******** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: **** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ********** ***** - *>=>
            {}}]}},
     {<***::**********[**:****, *************:**, ******************:*, ***********************:****] ******************** :: *** - *****>=>
       {:errors=>
         ["************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
          "************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
          "************ ********** ***** ****** ******** is invalid",
          "************ ********** is invalid",
          "************ is invalid"],
        :************=>
         [{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]*********** :: ****>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {:errors=>
              ["********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
               "********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
               "********** ***** ****** ******** is invalid",
               "********** is invalid"],
             :**********************=>
              [{<***::*******************[**:******, ************************:***]****-************ ******************** ***: * :: *** - ***** * ****** ** - ******* * **: *******>=>
                 {:errors=>
                   ["***** ****** ******** **** ********** **** ***** ***** ******* ******",
                    "***** ****** ******** **** ********** is invalid"],
                  :***************=>
                   [{<***::********************************[**:******, *************:******, ***********:******, ***********:"************ ************"]** * *** * ****-******* * ******** * ********* ******************** *********************: ***** :: "**** *" -> "">=>
                      {:errors=>["**** ***** ***** ******* ******"],
                       :**********=>
                        {<***::*****************[**:******, ****************:["****** ***", "****** ***", "****** ****", "******* ***", "******* ****", "******* ***", "****"], **:""] :: "**** *" -> "">=>
                          {:errors=>
                            ["***** ******* ******",
                             "***** ******* ******"]}}}}]}}]}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}}]}}]}}

프린트 프리프트린티트▁pretty프Hash순수 루비 사용(보석 없음)

저는 이 문제를 스스로 해결하려다가 우연히 이 실마리를 발견했습니다.

는 큰 이먹요었을 먹었습니다.Hash예쁘게 만들고 싶었지만 JSON 대신 루비 해시 표기법을 써야 했습니다.

코드 + 예제입니다.

  • pretty_generate를 사용하여 서식이 지정된 JSON 문자열을 가져옵니다.
  • 를 "JSON"으로 .symbol:
puts JSON.pretty_generate(result)
         .gsub(/(?:\"|\')(?<key>[^"]*)(?:\"|\')(?=:)(?:\:)/) { |_|
              "#{Regexp.last_match(:key)}:"
          }

샘플 JSON

{
  "extensions": {
    "heading": "extensions",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "tables": {
    "heading": "tables",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "foreign_keys": {
    "heading": "foreign_keys",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "all_indexes": {
    "heading": "all_indexes",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "keys": {
    "heading": "keys",
    "take": "all",
    "array_columns": [
      "name"
    ]
  }
}

샘플 루비 해시

{
  extensions: {
    heading: "extensions",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  tables: {
    heading: "tables",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  foreign_keys: {
    heading: "foreign_keys",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  all_indexes: {
    heading: "all_indexes",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  keys: {
    heading: "keys",
    take: "all",
    array_columns: [
      "name"
    ]
  }
}

사용자에게 인쇄할 경우 위의 답변을 사용합니다.

만약 당신이 그것을 콘솔에서만 인쇄하고 싶다면, 나는 irb 대신 프라이밍을 사용하는 것을 제안합니다.인쇄가 예쁜 것 외에도 프라이에는 많은 기능이 있습니다(아래 레일캐스트 확인).

보석 설치 프라이

다음 레일캐스트를 확인합니다.

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

키가 제정신이라고 믿을 경우 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
}

Pry를 사용하여 ~/.prirc에 다음 코드를 추가하기만 하면 됩니다.

require "awesome_print"
AwesomePrint.pry!

내가 시도한 모든 보석들 중에서show_data보석은 나에게 가장 잘 작동했고, 나는 이제 거의 항상 레일즈에서 파람 해시를 기록하기 위해 광범위하게 사용합니다.

중첩된 대형 해시의 경우 이 스크립트가 유용할 수 있습니다.복사하기 쉽도록 들여쓰기만 있는 멋진 파이썬/라이크 구문으로 중첩된 해시를 출력합니다.

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과 Rouge를 사용한 또 다른 접근법은 다음과 같습니다.

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)

저는 검색 엔진을 통해 최종 사용자에게 사람이 읽을 수 있는 형식(특히 키에 밑줄이 있는 해시)으로 해시를 인쇄하는 방법을 찾았습니다.

Rails 6.0.3.4를 사용한 결과는 다음과 같습니다.

hash.map do |key, val|
  key.to_s.humanize + ': ' + val.to_s
end.join('; ')

# Turns {:foo_bar => 'baz', :fee_ber => :bez} into 'Foo bar: Baz; Fee ber: Bez'.

Rails에서 Ruby의 배열 및 해시는 to_json 함수를 기본으로 제공합니다.웹 브라우저(예: Google Chrome) 내에서 매우 읽기 쉽기 때문에 JSON을 사용할 것입니다.

그렇다고 해도 너무 "기술적으로 보이는" 것이 걱정된다면 해시와 배열에 있는 곱슬곱슬한 교정기와 사각형 교정기를 흰색 공백 및 기타 문자로 대체하는 기능을 직접 작성해야 할 것입니다.

gsub 기능을 찾아 매우 좋은 방법을 찾아보세요.매력적으로 보이는 것을 찾을 때까지 다양한 캐릭터와 다양한 공백을 가지고 놀 수 있습니다.http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub

언급URL : https://stackoverflow.com/questions/8842546/best-way-to-pretty-print-a-hash

반응형