在 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 数据的主要内容,如果未能解决你的问题,请参考以下文章
db.session.commit()不能在postgresql(Heroku)中导入CSV文件
在windows的cmd中进入带空格的Program Files文件夹