3

我尝试在标题上强制引用。

Copy (
    SELECT *
    FROM "table"
)
TO <path> CSV HEADER FORCE QUOTE *;

有了这个,我得到了标题,除了标题之外,所有的都用引号引起来。所以我想要完全相反的。

TO <path> CSV HEADER FORCE QUOTE HEADER;

TO <path> CSV FORCE QUOTE HEADER;

不工作。

知道如何管理这个吗?

4

1 回答 1

7

COPY至少在 9.2 和更早的版本中,PostgreSQL 的支持中没有这样的选项。正如您已经观察到的,标题没有被引用 - 或者更确切地说,它们始终处于自动引用模式,因此只有在包含分隔符或其他特殊字符时才会引用它们:

\copy (SELECT 1 AS "First Value", 2 AS "Second value", 3 AS "Third value, with comma") TO '/tmp/test.csv' WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *);

产生:

First Value,Second value,"Third value, with comma"
"1","2","3"

您将需要通过一个更灵活的外部工具来转换 CSV,该工具了解 CSV 在使用中的所有奇怪和美妙的好处,或者使用外部工具直接生成它。

在这种情况下,我通常编写一个简单的 Perl 或 Python 脚本,使用 perl 的 DBI 和 DBD::Pg 或 Python 的 psycopg2 查询数据库,并使用适当的 CSV 库来输出所需的 CSV 方言。这样的脚本往往很简单,并且它们通常比\copyCSV 然后解析和重写它更有效。

于 2013-04-05T08:36:26.083 回答