해시를 예쁘게 인쇄하는 가장 좋은 방법
중첩된 배열과 해시가 포함된 대용량 해시가 있습니다.사용자가 '읽을 수 있도록' 간단하게 출력하고 싶습니다.
저는 그것이 꽤 읽기 쉽지만, 여전히 너무 기술적으로 보이기를 원합니다.
궁극적으로 이러한 데이터 청크를 읽고 깨끗하게 포맷해야 하는 최종 사용자가 될 것입니다.
좋은 의견이라도 있나?
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
'programing' 카테고리의 다른 글
| RVM과 함께 Ruby 1.9.3을 설치했지만 명령줄에 ruby -v가 표시되지 않음 (0) | 2023.06.03 |
|---|---|
| Mongo에서 사용되지 않는 필드를 제거하는 방법은 무엇입니까? (0) | 2023.06.03 |
| iPhone에서 처음 앱 실행을 감지하는 방법 (0) | 2023.06.03 |
| Linux에서 WPF가 이미 가능합니까? (0) | 2023.06.03 |
| VB.NET에서 자체 서명된 TLS/SSL 인증서 수락 (0) | 2023.06.03 |