在Postgres中,如何在COPY TO命令中保留换行符?

时间:2016-03-01 12:12:37

标签: postgresql

我的表格中的一列包含带有'\ n'的字符串。

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

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

但是当我使用COPY TO检索同一个表时,新行字符将被转义

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

1       Name : NOC\r
        \r
        Detail : Detail

如何让COPY TO命令用新行替换'\ n'?

预期产出:

for i in D:\Test\*\*.jpg; do convert -strip -interlace Plane -quality 80 $i $i; done 

如何实现这个?

3 个答案:

答案 0 :(得分:1)

您可以使用以下两种文字格式:

  1. 简单分隔文字
  2. CSV
  3. 我相信,对于第一种格式(您使用的格式),每条逻辑行也是一条物理线,这意味着没有任何方法可以绕过文字' \ 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"
    

答案 1 :(得分: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')

答案 2 :(得分:0)

我使用这种方式:

str1 <- c("abc 1993 def ghi; klm", "cba 2012 kff kkk; zzz", "xxx 1999 ggg yyy; vvv", 
"cgc 2015 tet mmm; bbb")

我认为可以像这样使用(SELECT nextval('seq'), E''||inputstr||'' FROM strongest);

COPY