首页 > 解决方案 > 如何将带有点作为千位分隔符的 CSV 文件导入 PostgreSQL

问题描述

我正在尝试将 CSV 文件读入 PostgreSQL。CSV 文件共有 20 列,当我在 PostgreSQL 中创建空表时,除了一列(称为“neto”)之外,我对每一列都有正确的数据类型。如果您尝试使用 Excel 打开 CSV 文件并检查“neto”列,您会看到它具有如下数字数据类型:“-1.234,10”,举个例子。

首先,我在 PostgreSQL 中创建一个空表:

CREATE TABLE invoices (
    FECHA TIMESTAMP,
    VENC TIMESTAMP,
    COMPANIA VARCHAR(100),
    FACTURA VARCHAR(100),
    GRUPO VARCHAR(100),
    CLIENTE VARCHAR(200),
    VENDEDOR VARCHAR(100),
    DESCRIP VARCHAR(300),
    SEGMENTO VARCHAR(100),
    MODELO VARCHAR(100),
    ARTICULO VARCHAR(200),
    CANTIDAD NUMERIC(100,50),
    UNIDAD DOUBLE PRECISION,
    ALMACEN DOUBLE PRECISION,
    PRECIO MONEY,
    IMPUESTO DOUBLE PRECISION,
    DESCUENTO VARCHAR(200),
    NETO MONEY,
    ANULADA VARCHAR(200),
    TASA DOUBLE PRECISION
);

然后,在尝试读取 CSV 后:

\copy invoices FROM 'C:/Users/Caproki/Desktop/INVOICES.CSV' DELIMITER ';' CSV HEADER;

我收到以下错误:

ERROR:  invalid input syntax for type money: "5.796,00"
CONTEXT:  COPY invoices, line 2, column neto: "5.796,00"

如您所见,由于我的本地设置,CSV 文件实际上是用分号而不是逗号分隔的,因为逗号用于分隔每个数字的整数部分和小数部分,而点则用作千位分隔符。

在进一步检查这个 CSV 文件后,似乎问题是因为这个点用作千位分隔符(例如,你有“1.200,00”而不是“1200,00”)。当我在 CSV 文件中更正此问题时,问题不再出现,我可以成功地将所有内容导入 PostregreSQL。

但是,我不愿意手动更改源 CSV 文件中列的数据类型,因为这是我每天都需要执行的导入过程。我想这样做是尽可能直接的,只是通过使用 SQL 导入 CSV 文件,我不是在寻找中间程序或解决这个简单问题的方法。

有没有办法在 PostgreSQL 中指定点用作千位分隔符?我在官方文档或其他 StackOverflow 问题中都找不到任何内容。

顺便说一句,我尝试将“neto”列的数据类型更改为数字、双精度和所有其他数字类型,但这并没有解决问题。

太感谢了。

标签: postgresqlcsvvalidationimportimport-from-excel

解决方案


你不能独自做到这一点COPY。它仅适用于类型输入函数可以理解的格式,这里不是这种情况。

要么在加载之前在 PostgreSQL 之外修改文件,要么将其加载到具有text此位置的列的表中,然后修改表。


推荐阅读