猫言猫语

严以律己·宽以待人·自强不息·知行合一

用Terminal Table画出字符表格

| 用Terminal Table画出字符表格已关闭评论

你可能使用过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}

评论已关闭。