如何从文件(csv/text)上传/导入数据类型为integer/double precision/bigint/num



我有一些文本文件。我无法将其导入PostgreSQL表,因为我的某些列具有NULL值。我的表的列的类型为integerbigintdouble precision

如果所有列的数据类型都是character varying,则导入效果良好。当使用上述数据类型时,我会得到一个错误。

样品台

create table if not exists test
(
col1 character varying,
col2 bigint default 0,
col3 integer default 0,
col4 double precision default 0.0,
col5 double precision default 0.0,
col6 character varying,
col7 character varying)

示例文本文件:

1234||||0.0566|ab3|
1234||||0.0566|ab3|
1234||2||0.0566|ab3|
1234|9465662698|||0.0566|ab3|

这是我正在使用的命令:

copy test.test1 (col1, col2, col3, col4, col5, col6, col7) FROM '/home/tanzir/Documents/test' DELIMITER '|'

我得到一个错误,比如:

ERROR:  invalid input syntax for type bigint: ""
CONTEXT:  COPY test1, line 1, column col2: ""

请帮我怎么解决?

对于csv文件,以下命令应足以满足

COPY public.test (col1, col2, col3, col4, col5, col6, col7) 
FROM '/home/tanzir/Documents/test' WITH(FORMAT CSV, DELIMITER '|');

对于文本文件,请使用以下命令

COPY public.test (col1, col2, col3, col4, col5, col6, col7) 
FROM '/home/tanzir/Documents/test' WITH(FORMAT TEXT, DELIMITER '|', NULL '');

这种行为的原因如下:

NULL:指定表示NULL值的字符串。默认值为文本格式的\N(反斜杠-N(,CSV格式的无引号空字符串。对于不想区分null和空字符串的情况,您可能更喜欢空字符串,即使是文本格式。使用二进制格式时不允许使用此选项。

来源:https://www.postgresql.org/docs/current/sql-copy.html

ps:因为你没有定义FORMAT,所以它使用默认的TEXT

问题是为COPY指定了默认的text格式,其中NULL值由N表示。选择csv格式:

COPY test.test1 FROM ... (FORMAT 'csv', DELIMITER '|');

最新更新