+ -
当前位置:首页 → 问答吧 → copy命令导入含换行符的文本

copy命令导入含换行符的文本

时间:2010-12-10

来源:互联网

今天做ETL时从 mysql导数据到 greenplum ,有个text字段中包含换行符.导致导入过程诸多错误

mysql不会将换行符转义为\n\r . 而PG中导入文本时 , 固定的以\n\r为行记录分割符,不能自定义文本记录换行符.

当PG直接使用Mysql导出的包含\n\r换行符的文本数据导入时,Mysql中的单条记录会被PG误解为的多条记录.

看看Mysql和PG的导入和导出换行符的区别吧:

一 Mysql导出换行符的格式

1 mysql的原始数据:
select newline_text  from user_data;
   a   
-------
usage
me
to

2 mysql中导的导出方式如下:
select newline_text into outfile 'user.dat' from user_data;

3 查看文本格式   
# cat 'user.dat
  usage
  me
  to

# cat 'user.dat|wc -l
3


二 PG导入和导出换行符的方式.

1 PG原始数据
mydb=# select * from text_newline;
   a   
-------
usage
  me
to
(1 row)

2 导出数据
mydb=# copy text_newline to '/var/tmp/newline.txt';

3 查看数据格式
more /var/tmp/newline.txt
usage\n me\nto

4 导入数据
mydb=# create external table ext_newline(a text)
LOCATION ('gpfdist://visit-history1:8081/newline.txt ')
FORMAT 'TEXT';

5 查看数据,格式正确
mydb=# select * from ext_newline;
   a   
-------
usage
  me
to
(1 row)


从上面两者换行符的导入导出格式可以看出来, Mysql中的换行符不做转义,直接包含写在文本数据中

PG导出的换行符做了转义,转义为\n字符串.

解决办法:从这个区别可以看出来,只需要把Mysql中导出换行符做转义,替换成显示的\r或\n就可以用来做PG的导入源了

用sed命令做转义: cat /var/tmp/newline.txt |sed 's/\r\\$//g;$!N;s/\n/\\r/'

可以先用 sed -n -e "l" newline.txt 看看转换前后的隐含字符.

作者: la19850302   发布时间: 2010-12-10

还是对回车换行的处理方式可能不一样。

作者: renxiao2003   发布时间: 2010-12-10