【问题标题】:Postgres import file that has columns separated by new lines具有由新行分隔的列的 Postgres 导入文件
【发布时间】:2013-08-23 04:17:49
【问题描述】:

我有一个每行一列的大文本文件,我想将此数据文件导入 Postgres。

我有一个有效的 MySQL 脚本。

 LOAD DATA LOCAL 
        INFILE '/Users/Farmor/data.sql' 
        INTO TABLE tablename 
        COLUMNS TERMINATED BY '\n';

我怎样才能把它翻译成 Postgres?我已经尝试过这个命令。

COPY tablename
    FROM '/Users/Farmor/data.sql' 
    WITH DELIMITER '\n'

但是它抱怨:

错误:COPY 分隔符必须是单个单字节字符

【问题讨论】:

  • '\n' 是一个两个字符的字符串(取决于字符串设置和 PostgreSQL 版本),你想说E'\n' 来换行。但这可能会给你一个“COPY 定界符不能是换行符或回车”错误,因为如果它们都使用相同的定界符,PostgreSQL 将无法区分列和行之间的区别。我猜您将不得不将您的数据文件修改为其他布局(甚至可能通过将其加载到 MySQL 中,然后将其从那里转储到 SQL 或 CSV)。
  • 你是对的。我将采用转储方法或编写 perl 脚本。真奇怪,Postgres 无法弄清楚,一个 10 列的表每隔 10 行就会有一个新行。将您的评论作为答案,以便我接受。

标签: mysql database postgresql


【解决方案1】:

虽然 postgresql 不会将 \n 识别为字段分隔符,但最初的问题询问如何将行作为单个列导入,这可以通过定义数据字符串中未找到的分隔符在 postgresql 中完成。例如:

COPY tablename
FROM '/Users/Farmor/data.sql' 
WITH DELIMITER '~';

如果在该行中没有找到~,postgresql会将整行视为一列。

【解决方案2】:

直接错误是因为\n 只是一个两个字符的字符串,\n

你想要:

COPY tablename
    FROM '/Users/Farmor/data.sql' 
    WITH DELIMITER E'\n'

E'' 语法是 PostgreSQL 扩展。

但它仍然不起作用,因为 PostgreSQL 的 COPY 无法理解带有换行符列分隔符的文件。我什至从未见过这种格式。

您需要使用其他工具加载它并转换 CSV。使用办公套件、用于 Python 的 csv 模块、用于 Perl 的 Text::CSV 或其他任何东西。然后将清理后的 CSV 输入 PostgreSQL。

【讨论】:

【解决方案3】:

您的分隔符是两个字符,因此它是有效的错误消息。

我相信最简单的方法是修改您从中导入的文件,并将分隔符实际更改为 \n 以外的其他内容,但在您的情况下这可能不是一个选项。

这个问题解决了同样的问题: ERROR: COPY delimiter must be a single one-byte character

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多