Chinaunix首页 | 论坛 | 博客
  • 博客访问: 815661
  • 博文数量: 127
  • 博客积分: 3662
  • 博客等级: 中校
  • 技术积分: 1371
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-02 12:36
个人简介

Linux&MySQL&PHP&Nginx&Apache&MSSQL&Shell

文章分类

全部博文(127)

文章存档

2016年(1)

2015年(8)

2014年(14)

2013年(26)

2012年(17)

2011年(28)

2010年(33)

分类: Mysql/postgreSQL

2013-04-26 13:58:18

mysql自带的导出功能:

点击(此处)折叠或打开

  1. select * from test
    into
    outfile '/var/lib/mysql/t.csv'
  2. fields terminated by ','
  3. optionally enclosed by '"'
  4. lines terminated by '\r\n';
要使用这个功能,数据库用户必须要赋予FILE权限,而且貌似只能在数据库服务器上操作(远程我没有试验成功,不知道是否可以)
为了避开以上的限制,使用了变通的方法,就是使用mysql命令将待导出的数据select出来,再使用sed命令配合正则表达式,将结果集修改为需要的csv格式后,重定向到输出文件!
第一步,先测试输出结果的格式,测试表test,使用默认命令输出如下:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -e "select * from t;"
  2. +-------+------+------+
  3. | staff | good | num |
  4. +-------+------+------+
  5. | a || 2 |
  6. | b || 4 |
  7. | c || 1 |
  8. | a || 2 |
  9. | b || 5 |
  10. | f | a | 2 |
  11. +-------+------+------+
可以发现mysql的默认输出格式,包含了列名和一些格式分隔符,要去掉表头,可以使用-N参数:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -N -e "select * from t;"
  2. +------+------+------+
  3. | a || 2 |
  4. | b || 4 |
  5. | c || 1 |
  6. | a || 2 |
  7. | b || 5 |
  8. | f | a | 2 |
  9. +------+------+------+
表头已经去掉了,但是其它无用的字符如何处理呢,显然-N达不到目的了,这里使用-s参数,先试试

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -s -e "select * from t;"
  2. staff good num
  3. a 甲 2
  4. b 乙 4
  5. c 丙 1
  6. a 乙 2
  7. b 丙 5
  8. f a 2
呵呵,那些杂乱的字符不见了,但是表头又回来了,看到这里,我们就知道,再把刚才那个-N参数加上就行了

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -s -N -e "select * from t;"
  2. a 甲 2
  3. b 乙 4
  4. c 丙 1
  5. a 乙 2
  6. b 丙 5
  7. f a 2
嗯,这样的数据基本差不多了,不过,要实现上一步,-s参数也能做到的,那就是再加一个"s",使用"-ss",也就是更精简的输出:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -ss -e "select * from t;"
  2. a 甲 2
  3. b 乙 4
  4. c 丙 1
  5. a 乙 2
  6. b 丙 5
  7. f a 2
三个s会怎样呢?呵呵,你试试看吧!这样,我们需要的数据已经出来了,这里说一个在测试过程中发现的意外的情况,还没想清楚是什么原因,就是分别使用"-N"和"-s"参数时,如果将结果集重定向到文件,得到的结果是一样的:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -N -e "select * from t;"
  2. +------+------+------+
  3. | a || 2 |
  4. | b || 4 |
  5. | c || 1 |
  6. | a || 2 |
  7. | b || 5 |
  8. | f | a | 2 |
  9. +------+------+------+
  10. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -N -e "select * from t;" > t.csv
  11. -bash-4.1$ cat t.csv
  12. a 甲 2
  13. b 乙 4
  14. c 丙 1
  15. a 乙 2
  16. b 丙 5
  17. f a 2
  18. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -s -e "select * from t;"
  19. staff good num
  20. a 甲 2
  21. b 乙 4
  22. c 丙 1
  23. a 乙 2
  24. b 丙 5
  25. f a 2
  26. -bash-4.1$ mysql -uopenser -openser -h192.168.21.56 --database test -s -e "select * from t;" > t.csv
  27. -bash-4.1$ cat t.csv
  28. a 甲 2
  29. b 乙 4
  30. c 丙 1
  31. a 乙 2
  32. b 丙 5
  33. f a 2
数据已经出来了,下一步就是如何格式化为csv格式,这里要用到linux下的sed命令:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -ss -e "select * from t;"|sed 's/\t/","/g;s/^/"/g;s/$/"\r/g'
  2. "a","","2"
  3. "b","","4"
  4. "c","","1"
  5. "a","","2"
  6. "b","","5"
  7. "f","a","2"
大功即将告成,sed命令用到了正则表达式,简单说下,我们得到的数据,每个字段之间是用制表符"\t"分隔的,所以第一个表达式s/\t/","/g  把所有的制表符替换为 ",",然后第二个表达式,将每行的开头加上双引号,第三个表达式将每行的结尾添加一个双引号和一个回车符"\r"(原始数据每行结尾只有一个换行符"\n",sed命令是处理去掉回车符后的字符串),这样,最后一步,把得到的文本输出到文件:

点击(此处)折叠或打开

  1. -bash-4.1$ mysql -uopenser -popenser -h192.168.21.56 --database test -ss -e "select * from t;"|sed 's/\t/","/g;s/^/"/g;s/$/"\r/g' > t.csv
  2. -bash-4.1$ cat t.csv
  3. "a","","2"
  4. "b","","4"
  5. "c","","1"
  6. "a","","2"
  7. "b","","5"
  8. "f","a","2"
OK!








阅读(1083) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~