【问题标题】:Insert `tsv` files into postgresql db将 `tsv` 文件插入 postgresql 数据库
【发布时间】:2013-12-08 15:52:46
【问题描述】:

我有几个文件保存为 tsv。我想将它们插入到postgresql db中,用sql分析它们。

但是,我的问题是如何将INSERT这个tsv文件放到windows 7下的postgresql 9.2

感谢您的回复!

PS.:我创建了具有正确值的表,例如:

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

文件在目录中:

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

【问题讨论】:

  • tsv 在文本搜索向量中,或者您的意思是 csv 在逗号分隔值中?如果是后者,请使用 COPY。
  • @Denis 谢谢你的回答。 tsv 我的意思是制表符分隔值。能否举例说明如何在 sql 语句中使用 COPY。

标签: database postgresql database-design insert tsv


【解决方案1】:

你想要这样的东西:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER E'\t';

E'\t' 是必需的,否则会出现如下错误:

错误:COPY 的 DELIMITER 必须是单个单字节字符


如果您的 TSV 中的列与您的表格不完全对齐,您还可以通过执行以下操作来定义映射:

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

【讨论】:

  • 如果在末尾添加CSV,也可以使用HEADER标志
  • 如果 .tsv 文件为表中已存在的 UNIQUE 列指定了值怎么办?
【解决方案2】:

对于制表符分隔的值,您可以使用 COPY:

http://www.postgresql.org/docs/current/static/sql-copy.html

根据文件的确切格式,可能类似于:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER '\t'

【讨论】:

  • 感谢您的回答。我立即尝试了,但得到:ERROR: DELIMITER for COPY must be a single one-byte character
  • 好的解决了我不得不输入一个标签而不是使用\tab。感谢您的帮助!
  • \t - tab 是默认的,所以在这种情况下,你不需要使用 DELIMITER
  • 尝试双引号而不是单引号
  • 我已经尝试了上面提到的所有方法,但对我有用的是在“FROM”子句之后添加(FORMAT CSV, DELIMITER E'\t', HEADER true)。希望这对任何人都有帮助。
【解决方案3】:

说起来很遗憾,但最简单的方法是将 TSV 转换为 CSV。大多数内置 Postgres 导入实用程序用于执行诸如将空字符串转换为空值、跳过标题等操作仅适用于 CSV

看这个简单的6 line Python answer on SO。我使用它,然后在尝试加载 TSV 一个小时后,在 Postgres 中正常加载 CSV,没有问题。

【讨论】:

  • 感谢下载投票。对于各种用例,赞成的答案将不起作用,因此上述建议。 ;)
  • 我不同意;默认的 postgresql COPY 命令默认为 TSV,我认为对 CSV 和 TSV 的支持没有区别。具体来说,您提到的两个命令都存在于 TSV 文件读取的配置中,根据此页面:postgresql.org/docs/9.6/static/sql-copy.html
【解决方案4】:

我可以使用来自csvkitcsvsql 执行此操作。

要读取 TSV(或 CSV)并将其创建/插入到表中,我的命令行脚本如下所示:

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

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2021-10-16
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多