我尝试在标题上强制引用。
Copy (
SELECT *
FROM "table"
)
TO <path> CSV HEADER FORCE QUOTE *;
有了这个,我得到了标题,除了标题之外,所有的都用引号引起来。所以我想要完全相反的。
TO <path> CSV HEADER FORCE QUOTE HEADER;
和
TO <path> CSV FORCE QUOTE HEADER;
不工作。
知道如何管理这个吗?
我尝试在标题上强制引用。
Copy (
SELECT *
FROM "table"
)
TO <path> CSV HEADER FORCE QUOTE *;
有了这个,我得到了标题,除了标题之外,所有的都用引号引起来。所以我想要完全相反的。
TO <path> CSV HEADER FORCE QUOTE HEADER;
和
TO <path> CSV FORCE QUOTE HEADER;
不工作。
知道如何管理这个吗?
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 方言。这样的脚本往往很简单,并且它们通常比\copy
CSV 然后解析和重写它更有效。