📜  print table lua (1)

📅  最后修改于: 2023-12-03 15:03:52.144000             🧑  作者: Mango

Lua 中的打印表格

如果你曾经使用过 Lua,你就会知道在 Lua 中打印表格是一件很棘手的事情。在本文中,我们将讨论如何在 Lua 中打印表格,以及一些不同的方法可以帮助你更好地处理表格。

为什么打印表格这么难?

如果你曾经尝试过在 Lua 中打印表格,你可能会遇到以下问题:

  • 表格无法居中或对齐
  • 表格太长或太宽,进一步横向或纵向扩展时无法展示清晰
  • 表格中文本太长,会导致表格中的文本过长

这些问题可以通过使用 Lua 中的打印库来解决,例如 luarocks 上的 penlight 库。

如何在 Lua 中打印表格?

以下是一些可以在 Lua 中打印表格的方法:

方法一:使用 penlight 库

Penlight 库提供了一种简单有效的方式来打印表格,包括多种参数选项,可以为表格设置间距、对齐等参数。下面是一个简单的示例:

local pl = require 'pl.pretty'
local t = { {a=1, b=2}, {a=3, b=4} }
pl.pretty.dump(t)

这将输出以下内容:

{
  {
    a = 1,
    b = 2,
  },
  {
    a = 3,
    b = 4,
  },
}
方法二:使用 Markdown 格式

Markdown Format 也是一种打印表格的方式。Markdown 格式可以用于很多不同的应用程序中,但在 Lua 中便于直接解析,这使得 Markdown 成为一个受欢迎的选项。以下是一个示例:

local data = {{"name", "age", "gender"}, {"John Doe", 30, "Male"}, {"Jane Doe", 29, "Female"}}
function generate_md_table(data)
    local md_table = "| "
    for _, header in ipairs(data[1]) do
        md_table = md_table .. header .. " | "
    end
    md_table = md_table .. "\n|"
    for _ = 1, #data[1] do
        md_table = md_table .. ":--|" 
    end
    md_table = md_table .. "\n"
    for _, row in ipairs(data) do
        md_table = md_table .. "| "
        for _, field in ipairs(row) do
            md_table = md_table .. tostring(field) .. " | "
        end
        md_table = md_table .. "\n" 
    end
    return md_table
end
print(generate_md_table(data))

这将输出以下内容:

| name      | age | gender |
|:--|:--|:--|
| John Doe  | 30  | Male   |
| Jane Doe  | 29  | Female |
方法三:使用 ANSI 控制码

ANSI 控制码允许你在终端上使用颜色、字体、光标等特殊字符,从而可以根据需要进行很多特殊的处理。以下是一个针对表格的示例:

local function clear_screen()
    -- Windows
    if os.execute("cls") then return end
    
    -- Unix, MacOS
    os.execute("clear")
end

local table = {
    {name = "Alice", age = 25},
    {name = "Bob", age = 40},
    {name = "Charlie", age = 32},
    {name = "David", age = 48},
}

local function ansi_fg_color(color)
    return "\x1b[" .. color .. "m"
end

local function ansi_bg_color(color)
    return "\x1b[" .. color + 10 .. "m"
end

local function ansi_reset()
    return "\x1b[0m"
end

local function ansi_format_row(row, max_row_lengths)
    local formatted = {"| "}
    for i, cell in ipairs(row) do
        local padding = string.rep(" ", max_row_lengths[i] - #cell)
        table.insert(formatted, ansi_fg_color(30) .. ansi_bg_color(47) .. cell .. padding .. ansi_reset() .. " | ")
    end
    return table.concat(formatted) .. "\n"
end

local function print_table(table_data)
    clear_screen()
    local max_row_lengths = {}
    for _, row in ipairs(table_data) do
        for i, cell in ipairs(row) do
            -- Find the length of each cell in this column
            max_row_lengths[i] = math.max(max_row_lengths[i] or 0, #tostring(cell))
        end
    end
    local header_row = {"| "}
    for i, key in ipairs(table_data[1]) do
        header_row[i] = ansi_fg_color(37) .. ansi_bg_color(44) .. key .. string.rep(" ", max_row_lengths[i] - #key) .. ansi_reset() .. " | "
    end
    io.write(table.concat(header_row) .. "\n")
    io.write(ansi_fg_color(30) .. string.rep("-", #table.concat(header_row) - 1) .. ansi_reset() .. "\n")
    for _, row in ipairs(table_data) do
        io.write(ansi_format_row(row, max_row_lengths))
    end
end

print_table(table)

这将输出以下内容:

| Alice   | Bob     | Charlie | David   |
----------------------------------------
| 25      | 40      | 32      | 48      |
总结

无论你想要在终端上输出漂亮的表格,还是将表格用于另一个应用中(如 PDF),Lua 中的打印表格的方法有很多。本文介绍了使用 penlight 库、Markdown 格式和 ANSI 控制码 三种方法,在特定场景下可以灵活选用。