You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何读取使用逗号作为小数分隔符的CSV文件?

PostgreSQL导入逗号分隔小数点CSV无需修改原文件的解决方案

结论

存在无需修改原始输入CSV的可行方案,以下是两种可直接落地的操作方法。

方案1:临时中转表转换(跨平台通用,兼容性最高)

PostgreSQL原生不支持逗号作为小数点的数值解析,你可以先将数据导入为文本类型再做转换,全程不修改原文件:

  1. 创建临时中转表,所有待导入的数值字段先声明为text类型,结构和CSV列完全对齐:
CREATE TEMP TABLE temp_csv_import (
    col_1 text,
    col_2 text,
    col_3 text,
    -- 其余列按CSV结构补全
);
  1. 直接用你原来的\copy命令导入数据到临时表,不会报类型错误:
    \copy temp_csv_import FROM 'filename.csv' DELIMITER ';' CSV HEADER;
  2. 写入正式目标表时,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:54:03