如何解决使用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 literal。 COPY
既快速又简单,但是不能容错。需要有效的输入。
一些可修复的选项:
-
在Excel中设置数字格式时不使用“组分隔符”(这就是噪音
,
的意思。) -
编辑CSV以删除组分隔符。 (但不要删除其他逗号!)
-
如果您负担得起
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
之前删除所有逗号。
在转换中会自动修剪前后空格。
如果表中已经有一些行,则也将来回转换现有值,这将触发整个表重写并膨胀该表。 不适用于大型桌子。
- 如果您无法轻松地修复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;
。
相关:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。