programing

콘솔에 출력 형식을 지정하고 탭 수를 지정합니다.

copyandpastes 2021. 1. 19. 08:18
반응형

콘솔에 출력 형식을 지정하고 탭 수를 지정합니다.


콘솔에 정보를 출력하는 스크립트를 생성하고 있습니다. 정보는 값이있는 일종의 통계입니다. 해시와 매우 흡사합니다.

따라서 한 값의 이름은 8 자이고 다른 값은 3입니다. 두 개의 정보를 출력하는 동안 반복 할 때 \ t 일부 열이 올바르게 정렬되지 않습니다.

예를 들어 출력은 다음과 같을 수 있습니다.

long value name          14
short              12
little             13
tiny               123421
long name again          912421

모든 값이 올바르게 정렬되기를 바랍니다. 지금 나는 이것을하고있다 :

puts "#{value_name} - \t\t #{value}"

하나의 탭만 사용하기 위해 긴 이름을 어떻게 말할 수 있습니까? 아니면 다른 해결책이 있습니까?


일반적 으로 멋지게 형식을 지정 하는 %10s일종의 printf체계가 있습니다.
하지만 루비를 전혀 사용하지 않았기 때문에 확인해야합니다.


예, 서식이있는 printf가 있습니다.
위의 예는 10 자 간격으로 오른쪽 정렬되어야합니다.
열에서 가장 넓은 필드를 기준으로 형식을 지정할 수 있습니다.

printf ([포트,] 형식, 인수 ...)

sprintf와 같은 형식에 따라 형식이 지정된 인수를 인쇄합니다. 첫 번째 인수가 IO 또는 해당 하위 클래스의 인스턴스 인 경우 해당 개체로 리디렉션 된 인쇄. 기본값은 $ stdout의 값입니다.


최대 길이가 20 자 이하인 경우 :

printf "%-20s %s\n", value_name, value

좀 더 역동적으로 만들고 싶다면 다음과 같이 잘 작동합니다.

longest_key = data_hash.keys.max_by(&:length)
data_hash.each do |key, value|
  printf "%-#{longest_key.length}s %s\n", key, value
end

String에는 정확히 다음과 같은 내장 ljust 가 있습니다.

x = {"foo"=>37, "something long"=>42, "between"=>99}
x.each { |k, v| puts "#{k.ljust(20)} #{v}" }
# Outputs:
#  foo                  37
#  something long       42
#  between              99

또는 탭을 원하는 경우 약간의 수학 (탭 표시 너비가 8이라고 가정)을 수행하고 짧은 표시 기능을 작성할 수 있습니다.

def tab_pad(label, tab_stop = 4)
  label_tabs = label.length / 8
  label.ljust(label.length + tab_stop - label_tabs, "\t")
end

x.each { |k, v| puts "#{tab_pad(k)}#{v}" }
# Outputs: 
#  foo                  37
#  something long       42
#  between              99

이전에는 버그가 거의 없었지만 이제 % 연산자와 함께 대부분의 printf 구문을 사용할 수 있습니다.

1.9.3-p194 :025 > " %-20s %05d" % ['hello', 12]
 => " hello                00012" 

물론 미리 계산 된 너비도 사용할 수 있습니다.

1.9.3-p194 :030 > "%-#{width}s %05x" % ['hello', 12]
  => "hello          0000c" 

내가 썼다

  • 열 너비 자동 감지
  • 공백이있는 공간
  • 배열 [[],[],...]또는 해시 배열[{},{},...]
  • 콘솔 창에 비해 너무 넓은 열을 감지하지 못함

    목록 = [[123, "SDLKFJSLDKFJSLDKFJLSDKJF"], [123456, "ffff"],]

array_maxes

def array_maxes(lists)
  lists.reduce([]) do |maxes, list|
    list.each_with_index do |value, index|
      maxes[index] = [(maxes[index] || 0), value.to_s.length].max
    end
    maxes
  end
end

array_maxes(lists)
# => [6, 24]

puts_arrays_columns

def puts_arrays_columns(lists)
  maxes = array_maxes(hashes)
  lists.each do |list|
    list.each_with_index do |value, index|
      print " #{value.to_s.rjust(maxes[index])},"
    end
    puts
  end
end

puts_arrays_columns(lists)

# Output:
#     123, SDLKFJSLDKFJSLDKFJLSDKJF,
#  123456,                     ffff,

그리고 다른 것

hashes = [
  { "id" => 123,    "name" => "SDLKFJSLDKFJSLDKFJLSDKJF" },
  { "id" => 123456, "name" => "ffff" },
]

hash_maxes

def hash_maxes(hashes)
  hashes.reduce({}) do |maxes, hash|
    hash.keys.each do |key|
      maxes[key] = [(maxes[key] || 0), key.to_s.length].max
      maxes[key] = [(maxes[key] || 0), hash[key].to_s.length].max
    end
    maxes
  end
end

hash_maxes(hashes)
# => {"id"=>6, "name"=>24}

puts_hashes_columns

def puts_hashes_columns(hashes)
  maxes = hash_maxes(hashes)

  return if hashes.empty?

  # Headers
  hashes.first.each do |key, value|
    print " #{key.to_s.rjust(maxes[key])},"
  end
  puts

  hashes.each do |hash|
    hash.each do |key, value|
      print " #{value.to_s.rjust(maxes[key])},"
    end
    puts
  end

end

puts_hashes_columns(hashes)

# Output:
#      id,                     name,
#     123, SDLKFJSLDKFJSLDKFJLSDKJF,
#  123456,                     ffff,

편집 : 길이에 고려 된 해시 키를 수정합니다.

hashes = [
  { id: 123,    name: "DLKFJSDLKFJSLDKFJSDF", asdfasdf: :a  },
  { id: 123456, name: "ffff",                 asdfasdf: :ab },
]

hash_maxes(hashes)
# => {:id=>6, :name=>20, :asdfasdf=>8}

열 열을 허용 하시겠습니까?

hashes.map{ |h| h.slice(:id, :name) }
# => [
#  { id: 123,    name: "DLKFJSDLKFJSLDKFJSDF" },
#  { id: 123456, name: "ffff"                 },
#]

나중에 참조하고 이것을 보거나 찾는 사람들을 위해 ... 보석을 사용하십시오. https://github.com/wbailey/command_line_reporter를 제안합니다.


일반적으로 탭을 사용하지 않고 공백을 사용하고 기본적으로 "열"을 설정하거나 이러한 유형의 문제가 발생합니다.

ReferenceURL : https://stackoverflow.com/questions/1087658/nicely-formatting-output-to-console-specifying-number-of-tabs

반응형