在 PostgreSQL 中导入带分隔符列表的 CSV 数据

Posted

技术标签:

【中文标题】在 PostgreSQL 中导入带分隔符列表的 CSV 数据【英文标题】:Import CSV data with delimiter tabulation in PostgreSQL 【发布时间】:2018-12-07 19:20:37 【问题描述】:

我有一个 csv 文件,其中包含“44444 521 hello”之类的数据。 这里的 Scapes 是“制表符”。

我想在名为“TEST1”的表中导入 csv 数据,所以我这样做了:

\copy TEST(attribut1,attribut2,attribut3) FROM '/mnt/c/Users/user1/Desktop/data/test1.csv' WITH DELIMITER E'\t' CSV HEADER;

属性1 = 整数。属性 2 = 整数。属性 3 = varchar(20)。

它说:

错误:整数的输入语法无效:“44444 521 hello” 上下文:复制 test1,第 2 行,列属性 1:“4444444 521 你好”

感谢您的宝贵时间。

编辑

这是在十六进制编辑器中的文件截图:

【问题讨论】:

看到 ***.com/questions/6113115/… 了吗?请在十六进制编辑器中打开您的文件,截屏并发布它,请 是的@CaiusJard,我见过这个页面。但它不起作用 引号中的数据是这样的吗?如果是这样,Postgres 理所当然地认为它们是一个值,其中制表符是字符串的一部分。 你的文件截图怎么样,用十六进制编辑器打开,怎么样? 我已经编辑了我的帖子@CaiusJard 【参考方案1】:

问题出现是因为您指定了 CSV,它会激活 postgres 的 csv 导入规则。您的文件不会被视为制表符分隔;它在每行的开头和结尾都有 " 引号,在 CSV 模式下表示“数据开头”/“数据结尾”,因此每行都被视为单个字段,里面的选项卡被视为数据,而不是分隔符

要么以文本模式导入(不指定 CSV),要么以 CSV 模式导入但指定不同的引号字符(文件中不存在的字符,1)以停止 " 被视为引号和2)所以没有其他字符可以被视为引号)

在任何一种情况下,您都必须在后期处理中删除引用 " 字符 - 我认为您不能在复制数据时动态操作数据,因此您必须将其加载到暂存中首先是表,(所有 varchar)然后去掉引号并将其加载到您的真实表中(REPLACE(data, '"', '')::int

或者,您可以对文件进行文本编辑,并在将其提供给 postgres 之前从中删除 " 字符

【讨论】:

以上是关于在 PostgreSQL 中导入带分隔符列表的 CSV 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 ES6 中导入带或不带大括号 [重复]

db.session.commit()不能在postgresql(Heroku)中导入CSV文件

Postgresql的Copy用法

在windows的cmd中进入带空格的Program Files文件夹

在windows的cmd中进入带空格的Program Files文件夹

如何仅在 VBA 逗号分隔列表中的字符串(而不是数字)上加上引号?