你可能使用过C语言printf函数在终端下输出多列数据,为了能让输出结果对齐好看颇费周折,你可能也用过MySQL客户端在命令行下执行SQL语句,MySQL查询结果那样字符表格应该如何实现呢?
Terminal Table就是这样一个使用Ruby语言编写,简单易用,功能强大的字符表格生成工具
安装方法
Terminal Table安装起来十分简单,只要你的系统支持Ruby的Gem,通过gem命令就可以轻松搞定:
gem install terminal-table
使用教程
基本用法
Terminal Table使用起来也十分方便,只需将terminal-table库包含到你的ruby源代码里
require 'terminal-table'
然后把你要输出的数据以二维数组的形式保存起来
rows = [] rows << ['One', 1] rows << ['Two', 2] rows << ['Three', 3] table = Terminal::Table.new :rows => rows puts table
执行puts输出,你就会看到字符表格的完美效果了
+-------+---+ | One | 1 | | Two | 2 | | Three | 3 | +-------+---+
赋值方法
上面示例是在构造函数中直接赋值,他还支持通过yield的方式进行赋值
table = Terminal::Table.new do |t| t.rows = rows end
如果你不爱写参数,可以用self关键字
table = Terminal::Table.new do self.rows = rows end
添加数据也可以一行一行地加
table = Terminal::Table.new do |t| t << ['One', 1] t.add_row ['Two', 2] end
分隔符效果
如果你想在把某两行分割一下,可以通过:separator这个符号来实现
table = Terminal::Table.new do |t| t << ['One', 1] t << :separator t.add_row ['Two', 2] t.add_separator t.add_row ['Three', 3] end puts table
+-------+---+ | One | 1 | +-------+---+ | Two | 2 | +-------+---+ | Three | 3 | +-------+---+
内容中如果带换行回车等特殊情况也是没有问题可以处理的
table = Terminal::Table.new do |t| t << ['One', 1] t << :separator t.add_row ["Two\nDouble", 2] t.add_separator t.add_row ['Three', 3] end puts table
+--------+---+ | One | 1 | +--------+---+ | Two | 2 | | Double | | +--------+---+ | Three | 3 | +--------+---+
表格头信息
上面的表格只有表格数据没有头信息,:headings属性可以设置表格头信息
table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows puts table
+-------+--------+ | Word | Number | +-------+--------+ | One | 1 | | Two | 2 | | Three | 3 | +-------+--------+
表格标题
:title属性可以为表格设置标题
table = Terminal::Table.new :title => "Cheatsheet", :headings => ['Word', 'Number'], :rows => rows puts table
+------------+--------+ | Cheatsheet | +------------+--------+ | Word | Number | +------------+--------+ | One | 1 | | Two | 2 | | Three | 3 | +------------+--------+
不过这个标题看起来有点怪怪的
对齐方式
可以针对某列指定其对齐方式,以更便于我们的查看,这个方法对数字列尤为有用
table.align_column(1, :right) puts table
+-------+--------+ | Word | Number | +-------+--------+ | One | 1 | | Two | 2 | | Three | 3 | +-------+--------+
甚至还可以针对某个数据单元单独设置其对齐方式
table << ["Four", {:value => 4.0, :alignment => :center}] puts table
+-------+--------+ | Word | Number | +-------+--------+ | One | 1 | | Two | 2 | | Three | 3 | | Four | 4.0 | +-------+--------+
其他风格
Terminal Table还可以设置表格宽度,更换制表符号
table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows, :style => {:width => 80} puts table
+--------------------------------------+---------------------------------------+ | Word | Number | +--------------------------------------+---------------------------------------+ | One | 1 | | Two | 2 | | Three | 3 | +--------------------------------------+---------------------------------------+
table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "x"} puts table
x====================x=================x | Cheatsheet | x====================x=================x | Word | Number | x====================x=================x | One | 1 | | Two | 2 | | Three | 3 | x====================x=================x
上面这个表格是不是感觉粗了一些,有三线表的意思呢?
不想每次table生成之后修改table风格,想更改默认输出风格也是没有问题的
Terminal::Style.defaults = {:width => 80}
setter方法
以上示例大都是构造函数中赋值,修改表格属性风格的,通过setter方法独立设置也可以
table = Terminal::Table.new table.title = "Cheatsheet" table.headings = ['Word', 'Number'] table.rows = rows table.style = {:width => 40}