Postgres - 使用双引号导入数据

zwo*_*nik 0 postgresql

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

\n\n

\xe2\x86\x92语音"邮件\xe2\x86\x92

\n\n

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

\n

Hal*_*Ali 5

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

示例:(在 postgresql 9.6 上测试)

创建一个测试表

CREATE TABLE dialogue (person TEXT, dialogue TEXT);
Run Code Online (Sandbox Code Playgroud)

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

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

在psql中执行以下命令

\copy dialogue FROM '/path/to/dialogue.txt' WITH CSV QUOTE '$' DELIMITER E'\t';
Run Code Online (Sandbox Code Playgroud)

示例输出:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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