PostGreSQL CSV导入行分隔符

时间:2017-08-26 09:51:45

标签: mysql postgresql csv

我正在尝试从MySQL表导出数据并将该数据导入PgSQl数据库。

来自MySQL的EXPORT脚本

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 IMPORT脚本

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

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

但是当我将选择限制增加到1或2时,它会导致错误。

  

错误:上一个预期列之后的额外数据   背景:COPY record_main,第1行:>"" 12635"," 55025"," 1"," ASCS", " P"," 5320700"," 2015-01-01> 00:00:00",\ N,\ N,\ N,\ N, \ N,\ N,"契据" \ N,\ N,\ N,\ N,..."

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

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

这次它工作正常。 我认为行分隔符中的错误。我的问题是我怎么能对PgSQl说行分隔符是这样的。比如我给了DELIMITER

3 个答案:

答案 0 :(得分:2)

据我所知,postgresql的copy statement期望行由换行符分隔:

  

COPY FROM可以处理以换行符,回车符或回车符/换行符结尾的行。

因此,您必须调整mysql导出以将新行字符用作行分隔符,或者您需要预处理转储以用新行替换;个字符。

答案 1 :(得分:2)

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复制语法很容易,所以也许这个答案对你有帮助。

答案 2 :(得分: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