将 `tsv` 文件插入到 PostgreSQL 数据库中。

23

我有几个以tsv格式保存的文件,希望将它们插入到postgresql数据库中,并使用sql进行分析。

然而,我的问题是如何在Windows 7下将这些tsv文件插入到postgresql 9.2中?

非常感谢您的回复!

附注:我已创建了包含正确值的表,例如:

CREATE TABLE ratings (distribution VARCHAR, votes VARCHAR, rank FLOAT, title VARCHAR);

该文件位于目录:

C:/Users/testUser/Desktop/TSV/ratings.list.tsv


1
tsv 指文本搜索向量,还是你的意思是 csv,即逗号分隔值?如果是后者,请使用 COPY。 - Denis de Bernardy
@Denis 感谢你的答复。我所说的TSV是指制表符分隔值。能否给出一个使用COPY命令的SQL语句示例呢? - Carol.Kar
4个回答

37
你想要这样的东西:
COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER E'\t';

需要使用 E'\t',否则会出现以下错误:

ERROR: DELIMITER for COPY must be a single one-byte character


如果 TSV 文件中的列与表格中的列不完全匹配,您还可以通过执行以下操作来定义映射关系:

COPY ratings (column_1, column_2, ... column_n)
  FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv'
  DELIMITER E'\t';

1
如果在末尾添加CSV,您还可以使用HEADER标志。 - kdazzle
如果.tsv文件指定了表中已经存在的唯一列的值,会发生什么? - Gershom Maes

25

9
谢谢您的回答。我立即尝试了它,但是出现了以下错误:ERROR: DELIMITER for COPY must be a single one-byte character - Carol.Kar
5
好的,问题解决了。我需要使用“制表符”键而不是使用“\tab”来解决它。感谢你的帮助! - Carol.Kar
2
\t - 制表符是默认的,因此在这种情况下,您不需要使用DELIMITER。 - Pavel Stehule
请尝试使用双引号而不是单引号。 - 111
3
我尝试过上述提到的所有方法,但对我有效的是在"FROM"子句之后添加"(FORMAT CSV, DELIMITER E'\t', HEADER true)"。希望这能帮助其他人。 - a-sie
显示剩余2条评论

2

我可以使用csvsql来完成这个任务,它是csvkit中的一部分。

要读取一个TSV(或CSV)文件并创建/插入到表中,我的命令行脚本如下:

csvsql --insert input.tsv  --table table_t --tabs --no-constraints --db postgresql://user:passwd@localhost/mydb

0
很遗憾,但最简单的方法是将TSV转换为CSV。大多数内置的Postgres导入工具都是用于像将空字符串转换为null、跳过标题等操作,仅适用于CSV
请参见这个简单的6行Python答案SO。我使用它,然后CSV正常加载,没有在Postgres中尝试一个小时来加载TSV时出现问题。

1
感谢您的下载投票。对于各种使用情况,被投票赞成的答案可能不适用,因此提出了上述建议。 ;) - Joseph Lust
4
我有不同的看法;默认的PostgreSQL COPY命令默认使用TSV格式,并且我没有看到对CSV和TSV支持方面的区别。具体来说,你提到的这两个命令都出现在配置TSV文件读取的页面上:https://www.postgresql.org/docs/9.6/static/sql-copy.html - John Clements

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接