PostgreSQL如何读取使用逗号作为小数分隔符的CSV文件?
PostgreSQL导入逗号分隔小数点CSV无需修改原文件的解决方案
结论
存在无需修改原始输入CSV的可行方案,以下是两种可直接落地的操作方法。
方案1:临时中转表转换(跨平台通用,兼容性最高)
PostgreSQL原生不支持逗号作为小数点的数值解析,你可以先将数据导入为文本类型再做转换,全程不修改原文件:
- 创建临时中转表,所有待导入的数值字段先声明为
text类型,结构和CSV列完全对齐:
CREATE TEMP TABLE temp_csv_import ( col_1 text, col_2 text, col_3 text, -- 其余列按CSV结构补全 );
- 直接用你原来的
\copy命令导入数据到临时表,不会报类型错误:\copy temp_csv_import FROM 'filename.csv' DELIMITER ';' CSV HEADER; - 写入正式目标表时,用
replace函数替换小数点后做类型转换即可:
INSERT INTO your_target_table (col_1, col_2, col_3, ...) SELECT col_1, col_2, REPLACE(col_3, ',', '.')::real, -- 其余数值列都执行相同的替换+类型转换,非数值列直接取值 FROM temp_csv_import;
临时表会在当前会话结束后自动删除,无需额外清理。
方案2:导入时实时流替换(操作更简便)
psql的\copy支持从外部程序的输出结果读取数据,你可以调用系统命令在内存中完成逗号替换,完全不改动原文件:
- Linux/macOS环境命令:
\copy your_target_table FROM PROGRAM 'sed -e "s/,/./g" filename.csv' DELIMITER ';' CSV HEADER; - Windows环境命令:
\copy your_target_table FROM PROGRAM 'powershell -Command "(Get-Content filename.csv) -replace '','', ''.''"' DELIMITER ';' CSV HEADER;
补充说明
你尝试的SET DECIMALSEPARATORCOMMA=ON不属于PostgreSQL的原生参数,该规则仅在部分第三方兼容数据库或旧定制版本中生效,PostgreSQL官方版本的数值解析逻辑固定以点作为小数点,无全局配置可修改该规则。
内容的提问来源于stack exchange,提问作者Arnold
相关产品推荐
相关产品推荐

