由 John Doe 三月 23, 2026
我们在业务系统中导出的 CSV 文件,头部往往都带有多行描述和说明,无法直接加载导入到 PostgreSQL 中进行处理。

特性提交日志
file_fdw 扩展:支持处理多行 HEADER 选项的能力。
提交记录 bc2f348 为 COPY 命令实现了 HEADER 选项的多行处理支持,本次提交将该能力拓展至 file_fdw 扩展,使其可实现对多行表头的跳过处理。
由于 CREATE/ALTER FOREIGN TABLE(创建 / 修改外部表)语句要求选项值必须使用单引号包裹,本次提交同时更新了 defGetCopyHeaderOption() 函数,使其支持 HEADER 选项接收以字符串格式传入的整数值。
讨论:https://postgr.es/m/CAOzEurT+iwC47VHPMS+uJ4WSzvOLPsZ2F2_wopm8M7O+CZa3Xw@mail.gmail.com
特性示例
通过支持字符串格式整数的 HEADER 选项,现在file_fdw外部表可以通过OPTIONS (header 'N')配置跳过前 N 行内容,原生支持处理带多行说明的 CSV 文件。
业务系统、财务平台、第三方导出的 CSV 文件,通常前几行是报表说明、导出时间、元数据等内容,有效数据从第 N 行开始。此前处理这类文件需要额外写脚本删除前 N 行,现在可直接通过file_fdw创建外部表查询,无需任何预处理。
现有202603_sales_report.csv文件,内容如下:
2026年3月销售报表
导出时间:2026-03-31 导出人:财务系统
order_id,amount,sales_time,department
1001,2999.00,2026-03-02 10:20:00,数码事业部
1002,1599.00,2026-03-06 14:30:00,家电事业部
前 2 行是报表说明,第 3 行是列头,第 4 行开始是有效数据,直接创建外部表查询:
-- 启用 file_fdw 扩展
CREATE EXTENSION IF NOT EXISTS file_fdw;
-- 创建文件服务
CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw;
-- 创建外部表,跳过前3行(2行说明+1行列头),直接读取有效数据
CREATE FOREIGN TABLE sales_report_202603 (
order_id text,
amount numeric,
sales_time timestamptz,
department text
)
SERVER file_server
OPTIONS (
format 'csv',
filename '/data/finance/202603_sales_report.csv',
header '3' -- 字符串格式指定跳过前3行
);
-- 直接查询有效数据
SELECT * FROM sales_report_202603 ORDER BY sales_time;
无需修改源文件、无需额外 ETL 脚本,即可直接查询业务导出的原生报表,大幅简化了离线数据分析的流程。
非常不错的体验,感谢所有参与的社区人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/26cb14aea12a0f0c2f9a49de3865721936b711a7