使用COPY导入超过1,000个格式化数字的问题

问题描述

我有一个Postgres数据库,一直在尝试使用以下代码将CSV文件导入到表中。我不断收到错误消息

ERROR:  invalid input syntax for type numeric: " 1,183.26 "

我认为问题在于值中有一个,,但是当我进入CSV并尝试编辑该值时,似乎,是由Excel自动添加的。

COPY invtest5
FROM 'C:\Users\Hank\Downloads\SampleData\SampleDataCSV.csv' 
DELIMITER ',' 
CSV HEADER;

表定义:

CREATE TABLE invtest5 (
    OrderDate date,Region varchar(255),Rep varchar(255),Item varchar(255),Units int,Unit_Cost numeric(15,3),Total numeric(15,3)
);

我正在寻找一种导入数据的方法,无论数字中是否包含,

解决方法

'1,183.26'不是有效的numeric literalCOPY既快速又简单,但是不能容错。需要有效的输入。

一些可修复的选项:

  1. 在Excel中设置数字格式时不使用“组分隔符”(这就是噪音,的意思。)

  2. 编辑CSV以删除组分隔符。 (但不要删除其他逗号!)

  3. 如果您负担得起ALTER目标表中的列类型(即,数据库上并发加载),则您具有必要的特权,并且没有依赖的对象会阻止),您可以:

ALTER TABLE invtest5
  ALTER unit_cost TYPE text,ALTER total     TYPE text;     -- both columns?

COPY ...

ALTER TABLE invtest5
  ALTER unit_cost TYPE numeric(15,3) USING (replace(unit_cost,','')::numeric),ALTER total     TYPE numeric(15,3) USING (replace(total,'')::numeric);

表达式(replace(unit_cost,'')::numeric)会在强制转换为numeric之前删除所有逗号。

在转换中会自动修剪前后空格。

如果表中已经有一些行,则也将来回转换现有值,这将触发整个表重写并膨胀该表。 不适用于大型桌子。

  1. 如果您无法轻松地修复CSV且无法负担得起目标表的费用(或者只是不想膨胀它),请使用临时登台表作为COPY目标,然后从那里INSERT
CREATE TEMP tmp_invtest5 AS TABLE invtest5 LIMIT 0;  -- copy basic structure

ALTER TABLE tmp_invtest5
  ALTER unit_cost TYPE text,ALTER total     TYPE text;     -- both columns?

COPY TO tmp_invtest5 ...

INSERT INTO invtest5 
      (orderdate,region,rep,item,units,unit_cost,total)
SELECT orderdate,replace(unit_cost,'')::numeric,replace(total,'')::numeric
FROM   tmp_invtest5
-- ORDER BY ??? -- while being at it?

临时表将在会话结束时自动删除。如果您需要此功能,请DROP TABLE tmp_invtest5;

相关:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...