从PostgreSQL导出包含换行符的数据为CSV

时间:2018-03-26 07:29:10

标签: postgresql csv view export

我试图将数据从postgresql导出到csv。

首先我创建了查询并尝试使用File - >导出来自pgadmin。导出为CSV。 CSV错误,因为它包含例如:

标题:Field1; Field2; Field3; Field4

现在,行开始很好,除了它把它放在另一行上的最后一个字段:

示例:

数据1;数据2;数据3;

数据4;

问题是我在尝试将数据导入另一台服务器时遇到错误。

数据来自我创建的视图。

我也试过

COPY view(field1,field2...) TO 'C:\test.csv' DELIMITER ',' CSV HEADER;

导出相同的文件。

我只想将数据导出到另一台服务器。

编辑:

尝试导入csv时出现错误:

  

错误:上一个预期列之后的额外数据。上下文复制   行动,第3行:<<<" Data1,data2等。">>

enter image description here

所以第一行是标题,第二行是第一行,数据减去最后一个字段,仅在第3行。

2 个答案:

答案 0 :(得分:1)

为了您在另一台服务器中导出文件,您有两个选择:

  • 在两台服务器之间创建共享文件夹,以便 数据库也可以访问此目录。

COPY (SELECT field1,field2 FROM your_table) TO '[shared directory]' DELIMITER ',' CSV HEADER;

  • 使用STDOUT触发从目标服务器导出 COPY。使用psql,您可以实现以下操作 命令:

psql yourdb -c "COPY (SELECT * FROM your_table) TO STDOUT" > output.csv

编辑:解决包含换行符的字段问题(\n

如果您想摆脱换行符,请使用REPLACE函数。

示例:

 SELECT E'foo\nbar';
 ?column? 
----------
 foo     +
 bar
(1 Zeile)

删除换行符:

SELECT REPLACE(E'foo\nbaar',E'\n','');
 replace 
---------
 foobaar
(1 Zeile)

所以你的COPY应该是这样的:

COPY (SELECT field1,REPLACE(field2,E'\n','') AS field2 FROM your_table) TO '[shared directory]' DELIMITER ',' CSV HEADER;

答案 1 :(得分:0)

上述导出程序是可以的,例如:

t=# create table so(i int, t text);
CREATE TABLE
t=# insert into so select 1,chr(10)||'aaa';
INSERT 0 1
t=# copy so to stdout csv header;
i,t
1,"
aaa"
t=# create table so1(i int, t text);
CREATE TABLE
t=# copy so1 from stdout csv header;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> i,t
1,"
aaa"
>> >> >> \.
COPY 1
t=# select * from so1;
 i |  t
---+-----
 1 |    +
   | aaa
(1 row)