2016-03-01 178 views
1

我的表格的一列中包含帶'\ n'的字符串。在Postgres中,如何在COPY TO命令中保留換行符?

postgres=# select * from stringtest ; 

id | inputstr 

----+----------------- 

    1 | Name : NOC\r + 

    | \r    + 

    | Detail : Detail 

(1 row) 

但是,當我取回同桌COPY TO,換行符是越來越逃脫

postgres=# COPY (select * from stringtest) TO STDOUT WITH DELIMITER E'\t' ; 

1  Name : NOC\r\n\r\nDetail : Detail 

我怎樣才能使COPY TO命令來替換「\ n」與新的生產線?

預期輸出:

postgres=# COPY (select * from stringtest) TO STDOUT WITH DELIMITER E'\t' ; 

1  Name : NOC\r 
     \r 
     Detail : Detail 

如何實現這一目標?

回答

1

有2種文本格式,你可以使用:

  1. 簡單分隔文本
  2. CSV

相信具有第一格式(您使用的)每個邏輯線也一個物理線,這意味着沒有辦法繞過文字'\ n'。但是,如果您使用CSV選項,則可以使用嵌入式換行符引用字符串:

test=# copy (select * from stringtest) to stdout csv; 
1,"line one 
linetwo" 

不是100%的預期產量,但如果CSV是對你罰款 - 這將這樣的伎倆。

隨着標籤分隔符:

test=# copy (select * from stringtest) to stdout csv delimiter E'\t'; 
1 "line one 
linetwo" 
+0

我認爲這是接近你會得到。 'COPY TO'被設計爲與'COPY FROM'兼容,這意味着*必須*能夠通過行分隔符(通過引用它們或轉義它們)來區分字面換行符。 –

+0

這對我很有幫助,非常感謝。 – sayali

1

您需要評估逃逸。像這樣的東西將工作

echo -e "`psql -c "COPY stringtest TO STDOUT WITH DELIMITER E'\t' ;"`" 

這是適當引用,所以你不會有空間壓碎。注:它會評估所有逃逸不只是「\ n」


對於反向操作COPY ... FROM stdin ...僅僅通過換行前添加一個反斜槓逃脫。對於選項卡或您選擇的任何分隔符也可以做同樣的事情。

如果您在終端直接輸入或運行文件\

postgres=# COPY stringtest FROM stdin WITH DELIMITER E'\t' ; 
>>Name : NOC\r\ 
>>\r\ 
>>Detail : Detail 
>>\. 
postgres=# 

或者在這裏的腳本語言處理數據是Python等效

forward or reverse 
.replace('\\n','\n') or .replace('\n','\\n') 
.replace('\\t','\t') or .replace('\t','\\t')