< 返回版块

黑豆腐 发表于 2020-02-14 09:50

Tags:rust

相信大家在写代码的过程中,不时的会遇到一些往标准输出显示表格的需求,那prettytable-rs就可以帮你轻松搞定。废话不多说,让我们看看怎么使用它吧~

依赖

[dependencies]
prettytable-rs = "^0.8"

基础用法

一个表单由数个Row组成,而每个Row由数个Cell组成。

#[macro_use] extern crate prettytable;

use prettytable::{Cell, Row, Table};

fn main() {
    // 创建表格
    let mut table = Table::new();

    // 添加行
    table.add_row(row!["ABC", "DEFG", "HIJKLMN"]);
    table.add_row(row!["foobar", "bar", "foo"]);
    // 通过Cell添加行
    table.add_row(Row::new(vec![
        Cell::new("foobar2"),
        Cell::new("bar2"),
        Cell::new("foo2"),
    ]));

    // 打印表格到标准输出
    table.printstd();
}

屏幕显示

+---------+------+---------+
| ABC     | DEFG | HIJKLMN |
+---------+------+---------+
| foobar  | bar  | foo     |
+---------+------+---------+
| foobar2 | bar2 | foo2    |
+---------+------+---------+

两个宏

table宏可以使得输入更加简便。下面的例子将产生和之前一样的屏幕输出。

#[macro_use] extern crate prettytable;

fn main() {
    let table = table!(["ABC", "DEFG", "HIJKLMN"],
                       ["foobar", "bar", "foo"],
                       ["foobar2", "bar2", "foo2"]);

    table.printstd();
}

ptable宏在创建表格之后还会执行输出。

#[macro_use] extern crate prettytable;

fn main() {
    let table = ptable!(["ABC", "DEFG", "HIJKLMN"],
                        ["foobar", "bar", "foo"],
                        ["foobar2", "bar2", "foo2"]);
}

调整表格的格式

通过prettytable::format::TableFormat可以设定表格的格式。比如说如下的例子

#[macro_use] extern crate prettytable;

use prettytable::{format, Table};

fn main() {
    let mut table = Table::new();
    let format = format::FormatBuilder::new()
        .column_separator('|')
        .borders('|')
        .separators(&[format::LinePosition::Top,
                      format::LinePosition::Bottom],
                    format::LineSeparator::new('-', '+', '+', '+'))
        .padding(1, 1)
        .build();
    table.set_format(format);
    
    table.set_titles(row!["Title 1", "Title 2"]);
    table.add_row(row!["Value 1", "Value 2"]);
    table.add_row(row!["Value three", "Value four"]);

    table.printstd();
}

会显示这样的输出

+-------------+------------+
| Title 1     | Title 2    |
| Value 1     | Value 2    |
| Value three | Value four |
+-------------+------------+

但实际上prettytable::format::consts提供了很多常用的格式,基本已经够用了。 比如想要这样的输出

+-------------+------------+
| Title 1     | Title 2    |
+-------------+------------+
| Value 1     | Value 2    |
| Value three | Value four |
+-------------+------------+

可以用

use prettytable::format;

table.set_format(*format::consts::FORMAT_NO_LINESEP_WITH_TITLE;

而想要这样的输出

Title 1     | Title 2
------------+------------
Value 1     | Value 2
Value three | Value four

可以用

use prettytable::format;

table.set_forma(*format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR);

CSV格式的读取/输出

表格可以被输出成CSV格式,也可以从CSV格式的文件创建表格。可以简单参考如下的例子

#[macro_use] extern crate prettytable;

use std::fs::File;
use prettytable::{Cell, Row, Table};

fn main() {
    let mut table = Table::new();

    table.add_row(row!["ABC", "DEFG", "HIJKLMN"]);
    table.add_row(row!["foobar", "bar", "foo"]);

    table.add_row(Row::new(vec![
        Cell::new("foobar2"),
        Cell::new("bar2"),
        Cell::new("foo2"),
    ]));

    let out = File::create("output.csv").unwrap();
    // 写入
    table.to_csv(out).unwrap();

    // 读取
    let table = Table::from_csv_file("output.csv").unwrap();
    table.printstd();
}

注意产生/读取的CSV文件的分隔符是逗号,并且没有头。

小结

现在想必各位都已经快成为Rust的表格打印大师了。以后可以在命令行里没事就秀个表格亮瞎别人的狗眼啦~

评论区

写评论
Mark 2020-02-15 16:38

康康

1 共 1 条评论, 1 页