2013-04-05 22 views
3

我嘗試在標題上強制引用。postgresql:在標題上強制引用

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

有了這個,我得到了標題,除了標題以外,所有的都在引號中。所以我想要完全相反。

TO <path> CSV HEADER FORCE QUOTE HEADER; 

TO <path> CSV FORCE QUOTE HEADER; 

沒有工作。

任何想法如何管理?

回答

7

PostgreSQL的COPY支持中沒有這樣的選項,至少在9.2及更高版本中是可用的。正如你已經看到,標題中沒有報價 - 或者更確切地說,他們總是在自動報價模式,因此,如果包含一個分隔符或其他特殊字符他們只引用:

\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方言。這樣的腳本通常很簡單,並且通常比CSV更有效,然後解析並重寫它。

+1

@OliverF。你的建議編輯實際上是不正確的,因爲'psql'的'\ copy'(不同於PostgreSQL的服務器端'COPY'命令)*必須出現在單行上*。我沒有明確指出,上面使用*'psql' client *時使用了'\ copy',但是它隱含在所用命令的形式中。 – 2013-08-05 14:48:26