Дополнение печатного вывода табличных данных - PullRequest
11 голосов
/ 02 марта 2009

Я знаю, что это, вероятно, очень просто, но у меня есть некоторые данные, подобные этой, в одном файле:

Artichoke

Green Globe, Imperial Star, Violetto

24" deep

Beans, Lima

Bush Baby, Bush Lima, Fordhook, Fordhook 242

12" wide x 8-10" deep

, что я хотел бы иметь возможность форматировать в хороший тип таблицы TSV, чтобы выглядеть примерно так:

    Name  | Varieties    | Container Data
----------|------------- |-------
some data here nicely padded with even spacing and right aligned text 

Ответы [ 7 ]

18 голосов
/ 01 июня 2012

Я написал гем, чтобы сделать именно это: http://tableprintgem.com

18 голосов
/ 02 марта 2009

Попробуйте String#rjust(width):

"hello".rjust(20)           #=> "               hello"
16 голосов
/ 31 июля 2012

Никто не упомянул «самый крутой» / самый компактный способ - используя оператор % - например: "%10s %10s" % [1, 2]. Вот некоторый код:

xs = [
  ["This code", "is", "indeed"],
  ["very", "compact", "and"],
  ["I hope you will", "find", "it helpful!"],
]
m = xs.map { |_| _.length }
xs.each { |_| _.each_with_index { |e, i| s = e.size; m[i] = s if s > m[i] } }
xs.each { |x| puts m.map { |_| "%#{_}s" }.join(" " * 5) % x }

Дает:

      This code          is          indeed
           very     compact             and
I hope you will        find     it helpful!

Вот код, сделанный более читабельным:

max_lengths = xs.map { |_| _.length }
xs.each do |x|
  x.each_with_index do |e, i|
    s = e.size
    max_lengths[i] = s if s > max_lengths[i]
  end
end
xs.each do |x|
  format = max_lengths.map { |_| "%#{_}s" }.join(" " * 5)
  puts format % x
end
7 голосов
/ 02 марта 2009

Это достаточно полный пример, который предполагает следующее

  • Ваш список продуктов содержится в файле с именем veg.txt
  • Ваши данные распределены по трем строкам в записи с полями в последовательных строках

Я немного новичок, так что, несомненно, есть лучшие и более элегантные способы сделать это

#!/usr/bin/ruby

class Vegetable

  @@max_name ||= 0  
  @@max_variety ||= 0  
  @@max_container ||= 0  

  attr_reader :name, :variety, :container

  def initialize(name, variety, container)
    @name = name
    @variety = variety
    @container = container  

    @@max_name = set_max(@name.length, @@max_name)  
    @@max_variety = set_max(@variety.length, @@max_variety)  
    @@max_container = set_max(@container.length, @@max_container)
  end

  def set_max(current, max)
    current > max ? current : max
  end

  def self.max_name  
    @@max_name  
  end  

  def self.max_variety  
    @@max_variety  
  end  

  def self.max_container()  
    @@max_container  
  end  

end

    products = []


    File.open("veg.txt") do | file|

      while name = file.gets
        name = name.strip
        variety = file.gets.to_s.strip
        container = file.gets.to_s.strip
        veg = Vegetable.new(name, variety, container)
        products << veg
      end
    end

    format="%#{Vegetable.max_name}s\t%#{Vegetable.max_variety}s\t%#{Vegetable.max_container}s\n"
    printf(format, "Name", "Variety", "Container")
    printf(format, "----", "-------", "---------")
    products.each do |p|
        printf(format, p.name, p.variety, p.container)
    end

Следующий пример файла

Artichoke
Green Globe, Imperial Star, Violetto
24" deep
Beans, Lima
Bush Baby, Bush Lima, Fordhook, Fordhook 242
12" wide x 8-10" deep
Potatoes
King Edward, Desiree, Jersey Royal
36" wide x 8-10" deep

Произвел следующий вывод

       Name                                      Variety                Container
       ----                                      -------                ---------
  Artichoke         Green Globe, Imperial Star, Violetto                 24" deep
Beans, Lima Bush Baby, Bush Lima, Fordhook, Fordhook 242    12" wide x 8-10" deep
   Potatoes           King Edward, Desiree, Jersey Royal    36" wide x 8-10" deep
3 голосов
/ 05 ноября 2013

другой камень: https://github.com/visionmedia/terminal-table Terminal Table - это быстрый и простой, но многофункциональный генератор таблиц ASCII, написанный на Ruby.

3 голосов
/ 07 марта 2011

У меня есть небольшая функция для печати 2D-массива в виде таблицы. Каждая строка должна иметь одинаковое количество столбцов, чтобы это работало. Это также легко настроить для ваших нужд.

def print_table(table)
  # Calculate widths
  widths = []
  table.each{|line|
    c = 0
    line.each{|col|
      widths[c] = (widths[c] && widths[c] > col.length) ? widths[c] : col.length
      c += 1
    }
  }
  # Indent the last column left.
  last = widths.pop()
  format = widths.collect{|n| "%#{n}s"}.join(" ")
  format += " %-#{last}s\n"
  # Print each line.
  table.each{|line|
    printf format, *line
  }
end
0 голосов
/ 02 марта 2009

Kernel.sprintf должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...