【问题标题】:Postgres - import data with double quotePostgres - 用双引号导入数据
【发布时间】:2017-07-14 23:07:12
【问题描述】:

由于数据中出现双引号,我在从 csv 文件导入制表符分隔数据时遇到问题,例如:

→语音“邮件”→

我正在使用 pgadmin III 中的导入选项导入数据。我将制表符指定为分隔符,并尝试使用选项 QUOTE 和/或 ESCAPE。这些都不起作用。我知道这是双引号的问题,因为我从文件中删除了它并且导入成功。我也知道这个问题已经提出(Is it possible to turn off quote processing in the Postgres COPY command with CSV format?),但我不能使用选项COPY <tablename> FROM <filename>,因为我正在将数据导入远程数据库并且我的电脑上文件的相对路径不被接受。我想避免修改输入文件,因为它可能很大。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    如果您想保留双引号,请将QUOTE 设置为其他值(我会使用您的数据文件中不存在的字符)。

    示例:(在 postgresql 9.6 上测试)

    创建测试表

    CREATE TABLE dialogue (person TEXT, dialogue TEXT);
    

    使用以下示例数据创建一个测试数据文件(制表符分隔)。

    # dialogue.txt
    jim I ran into your ex. He says "hi"
    rachel  did he now? well tell him i said "don't call me"
    

    在psql中执行以下命令

    \copy dialogue FROM '/path/to/dialogue.txt' WITH CSV QUOTE '$' DELIMITER E'\t';
    

    示例输出:

    etl_db=# \copy dialogue from '~/Desktop/dialogue.txt' WITH CSV DELIMITER E'\t' QUOTE '$';
    COPY 2
    etl_db=# select * from dialogue;
     person |                     dialogue
    --------+--------------------------------------------------
     jim    | I ran into your ex. He says "hi"
     rachel | did he now? well tell him i said "don't call me"
    (2 rows)
    

    我正在将数据导入远程数据库,但我的 PC 上的文件的相对路径不被接受。我想避免修改输入文件,因为它可能很大。

    对 postgresql 使用 psql 命令行客户端。它支持 \copy 元命令,该命令环绕 sql 命令 COPY,并允许您将记录从本地计算机流式传输到服务器。

    我尝试过使用“|”作为 QUOTE,因为我的数据有很多特殊字符,例如:%$^&*# 我收到此错误:错误:编码“WIN1252”中字节序列为 0x8f 的字符在编码 UTF8 时没有等效字符。我的系统语言环境是:波兰语(波兰)

    COPY 命令有一个ENCODING 选项。您可以使用它来指定文件以 utf8 或其他编码进行编码。

    【讨论】:

    • 只是为了确保我理解您的评论。我的数据没有被引用(双引号或单引号),而是制表符分隔,它可以有单引号或双引号匹配或不匹配。您建议使用 WITH CSV QUOTE '$' 告诉 postgres 查找 '$' 作为引号,并且由于它不在数据中,它只会使用制表符来分隔数据?
    • 是的,没错。您是否尝试了上述解决方案,它是否有效或抛出错误?
    • 我试过用 '|'作为 QUOTE 因为我的数据有很多特殊字符,例如:%$^&*# 我收到此错误:错误:在编码“WIN1252”中字节序列为 0x8f 的字符在编码 UTF8 时没有等价物
    • 确实没有。您的操作系统区域设置是什么?我找不到任何| 为 0x8F 的编码。
    • 我的系统语言环境是:波兰语(波兰)
    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2018-05-09
    • 1970-01-01
    • 2019-11-02
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多