Отличный вывод форматирования на консоль, указав количество вкладок
Я генерирую script, который выводит информацию на консоль. Информация представляет собой некоторую статистику со значением. Так же, как хэш.
Таким образом, одно имя значения может содержать 8 символов, а другое - 3. Когда я перебираю информацию с помощью двух \t, некоторые из столбцов не выравниваются правильно.
Итак, например, вывод может быть таким:
long value name 14
short 12
little 13
tiny 123421
long name again 912421
Я хочу, чтобы все значения выстроились правильно. Сейчас я делаю это:
puts "#{value_name} - \t\t #{value}"
Как я могу говорить для длинных имен, чтобы использовать только одну вкладку? Или есть другое решение?
Ответы
Ответ 1
Обычно существует форма %10s
printf
, которая отлично форматирует.
Тем не менее, я вообще не использовал рубин, поэтому вам нужно проверить это.
Да, есть printf с форматированием.
Вышеприведенный пример должен быть выровнен по правому краю в 10 символах.
Вы можете форматировать на основе самого широкого поля в столбце.
printf ([port,] format, arg...)
Печатает аргументы, отформатированные в соответствии с форматом типа sprintf. Если первым аргументом является экземпляр IO или его подкласса, печать перенаправляется на этот объект. по умолчанию используется значение $stdout.
Ответ 2
Если вы знаете максимальную длину не более 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
Ответ 3
В нем было несколько ошибок, но теперь вы можете использовать большую часть синтаксиса printf с помощью оператора%:
1.9.3-p194 :025 > " %-20s %05d" % ['hello', 12]
=> " hello 00012"
Конечно, вы также можете использовать предварительно просчитанную ширину:
1.9.3-p194 :030 > "%-#{width}s %05x" % ['hello', 12]
=> "hello 0000c"
Ответ 4
Строка имеет встроенный 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
Ответ 5
Я написал вещь
- Автоматически определяет ширину столбцов
- Пространства с пробелами
- Массив массивов
[[],[],...]
или массив хэшей [{},{},...]
-
Не обнаруживает слишком большие столбцы для окна консоли
lists = [ [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" },
#]
Ответ 6
Для справки в будущем и людей, которые смотрят на это или находят его... Используйте драгоценный камень. Я предлагаю https://github.com/wbailey/command_line_reporter
Ответ 7
Как правило, вы не хотите использовать вкладки, вы хотите использовать пробелы и по существу настраивать свои "столбцы" самостоятельно, иначе вы сталкиваетесь с такими проблемами.