⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
直接读取文件

DuckDB 允许通过 read_textread_blob 函数直接读取文件。这些函数接受文件名、文件名列表或 glob 模式,并分别以 VARCHARBLOB 格式输出每个文件的内容,以及文件大小和最后修改时间等额外元数据。

read_text

表格函数 read_text 从选定的源读取数据到 VARCHAR 类型。每个文件对应一行,其中 content 字段包含相应文件的全部内容。

SELECT size, parse_path(filename), content
FROM read_text('test/sql/table_function/files/*.txt');
大小 parse_path(filename) 内容
12 [test, sql, table_function, files, one.txt] Hello World!
2 [test, sql, table_function, files, three.txt] 42
10 [test, sql, table_function, files, two.txt] Foo Bar\nFöö Bär

文件内容首先会被验证为有效的 UTF-8 编码。如果 read_text 尝试读取包含无效 UTF-8 编码的文件,则会抛出错误,并建议改用 read_blob

read_blob

表格函数 read_blob 从选定的源读取数据到 BLOB 类型。

SELECT size, content, filename
FROM read_blob('test/sql/table_function/files/*');
大小 内容 文件名
178 PK\x03\x04\x0A\x00\x00\x00\x00\x00\xACi=X\x14t\xCE\xC7\x0A… test/sql/table_function/files/four.blob
12 Hello World! test/sql/table_function/files/one.txt
2 42 test/sql/table_function/files/three.txt
10 F\xC3\xB6\xC3\xB6 B\xC3\xA4r test/sql/table_function/files/two.txt

模式

read_textread_blob 返回的表的模式是相同的。

DESCRIBE FROM read_text('README.md');
列名 (column_name) 列类型 (column_type) null key 默认值 (default) 额外信息 (extra)
文件名 VARCHAR 是 (YES) NULL NULL NULL
内容 VARCHAR 是 (YES) NULL NULL NULL
大小 BIGINT 是 (YES) NULL NULL NULL
last_modified TIMESTAMP 是 (YES) NULL NULL NULL

处理缺失的元数据

在底层文件系统无法提供某些数据(例如,HTTPFS 无法始终返回有效时间戳)的情况下,相应单元格将被设置为 NULL

支持投影下推

这些表格函数还利用投影下推来避免不必要的属性计算。因此,例如,您可以使用此功能来 glob 包含大量文件的目录,以获取 size 列中的文件大小,只要您省略 content 列,数据就不会被读取到 DuckDB 中。