⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
导入 Duckbox 表

本页面提供的脚本适用于 Linux、macOS 和 WSL。

默认情况下,DuckDB CLI 客户端duckbox 格式呈现查询结果,该格式使用丰富的 ASCII 艺术风格表格来展示数据。这些表格经常被逐字分享在其他文档中。例如,以用于演示 DuckDB v1.2.0 版本发布博客文章中 CSV 新功能的表格为例。

┌─────────┬───────┐
│    a    │   b   │
│ varchar │ int64 │
├─────────┼───────┤
│ hello   │    42 │
│ world   │    84 │
└─────────┴───────┘

如果我们想将这些数据加载回 DuckDB 该怎么办?默认情况下不支持此操作,但可以通过一些脚本来实现:我们可以将表格转换为以 分隔的文件,并使用 DuckDB 的 CSV 读取器进行读取。请注意,分隔符不是管道字符 |,而是“框线绘制轻垂直”字符 (Box Drawings Light Vertical)

将 Duckbox 表格加载到 DuckDB

首先,我们将上面的表格保存为 duckbox.csv。然后,使用 sed 对其进行清理

echo -n > duckbox-cleaned.csv
sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" duckbox.csv >> duckbox-cleaned.csv
sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" duckbox.csv >> duckbox-cleaned.csv

duckbox-cleaned.csv 文件的内容如下

a│b
hello│42
world│84

然后,我们可以通过以下方式将其简单地加载到 DuckDB 中

FROM read_csv('duckbox-cleaned.csv', delim = '│');

并将其导出为 CSV

COPY (FROM read_csv('duckbox-cleaned.csv', delim = '│')) TO 'out.csv';
a,b
hello,42
world,84

使用 shellfs

要通过单个 read_csv 调用解析 duckbox 表格(无需创建任何临时文件),我们可以使用 shellfs 社区扩展

INSTALL shellfs FROM community;
LOAD shellfs;
FROM read_csv(
        '(sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" duckbox.csv; ' ||
        'sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" duckbox.csv) |',
        delim = '│'
    );

我们还可以创建一个 表宏 (table macro)

CREATE MACRO read_duckbox(path) AS TABLE
    FROM read_csv(
            printf(
                '(sed -n "2s/^│ *//;s/ *│$//;s/ *│ */│/p;2q" %s; ' ||
                'sed "1,4d;\$d;s/^│ *//;s/ *│$//;s/ *│ */│/g" %s) |',
                path, path
            ),
            delim = '│'
        );

那么,读取 duckbox 表格就像下面这样简单

FROM read_duckbox('duckbox.csv');

shellfs 是一个社区扩展,不提供任何支持或保证。请仅在确保输入已适当消毒 (sanitized) 的情况下使用它。请查阅 确保 DuckDB 安全页面以获取更多详细信息。

限制

在运行此脚本时,请考虑以下限制

  • 此方法仅在表格中不包含长管道 字符时有效。它还会修剪表格单元格值中的空格。在运行脚本时,请确保考虑到这些假设。

  • 该脚本同时兼容 BSD sed(macOS 默认)和 GNU sed(Linux 默认,macOS 上可用作 gsed)。

  • 只有受 CSV 探测器支持的数据类型才能被正确解析。包含嵌套数据的值将被解析为 VARCHAR

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南