2017-08-26 143 views
1

我想从MySQL表中导出数据并将该数据导入到PgSQl数据库中。PostGreSQL CSV导入行分隔符

导出脚本从MySQL

select column_names from from table_name LIMIT 2 
INTO OUTFILE 'E:/CSV_files/record_main.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY ';' 

PGSQL导入脚本

COPY record_main("column_names ") FROM 'E:/CSV_files/record_main.csv' 
WITH DELIMITER ',' NULL '\N' ESCAPE ';' CSV 

上面的代码工作对我来说很好,当我试图导出和导入CSV。

但是,当我增加选择限制1至2或任何,它会导致错误。

ERROR: extra data after last expected column CONTEXT: COPY record_main, line 1: >""12635","55025","1","ASCS","P","5320700","2015-01-01 >00:00:00",\N,\N,\N,\N,\N,\N,"DEED",\N,\N,\N,\N,..."

然后打开CSV文件,我手动将一行数据分成两行数据。

我从每行的末尾删除了分号。

这次它工作正常。 我觉得在行分隔符错误。我的问题是我怎么能说到PgSQl到行分隔符是这个。像我给出的DELIMITER

回答

2

据我所知,PostgreSQL的copy statement预计行通过新行字符(S)分开:

COPY FROM can handle lines ending with newlines, carriage returns, or carriage return/newlines.

所以,你必须调整mysql的出口使用新行字符作为行分隔符,或者您需要预处理转储以用新行替换;字符。

1

this SO question你应该使用COPY语法是:

COPY record_main FROM 'E:/CSV_files/record_main.csv' DELIMITERS ',' CSV; 

正如你所看到的,这是你想要运行的命令不同。但COPY在数据库服务器上运行并需要一个root帐户。如果你没有一个,你也可以尝试使用\copy

\copy record_main(col1, col2, ...) FROM 'E:/CSV_files/record_main.csv' 
    DELIMITER ',' CSV 

更新:

@shadow正确地指出,你需要你的MySQL数据导出到其线条是一个CSV文件用行分隔符分隔,而不是分号。但是你的Postgres复制语法看起来不对,所以也许这个答案仍然会对你有帮助。

+0

在\ copy文件名中不使用引号。 – Jasen

0

谢谢你们,

我做错了这里通过给错了行分隔符而从MySQL创建CSV。

正确答案

INTO OUTFILE 'E:/CSV_files/record_main-new.csv' 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 

没有必要指定自动PostgreSQL的行分隔符或默认"\n"

从CSV到PostgreSQL进口。

FROM 'E:/CSV_files/record_main-new.csv' 
WITH DELIMITER ',' NULL '\N' CSV