运维经常遇到客户要求下载某些数据列表的需求。一般我们是提供一个csv格式的文件。
如果用shell来做这件事的,通常是两种方法:
1.捕获终端输出,后续对输出做一定处理。但是终端输出实际上已经丢失了很多格式信息,很难做到完善处理。
2.用mysql内置的FILE命令一次性生成文件。mysql内置的函数功能有限,没法做到比较好的输出格式化。
所以选择了python来做。
主要注意几点:
1.我们的数据库是使用utf8编码。所以生成的csv文件默认话就是utf8编码。实际上也不应该转码,因为utf8的unicode字符集是gbk的等字符集的超集,所以转换有可能会丢失一部分信息。
2.客户一般是使用windows的excel软件打开csv文件,excel要正确打开utf8编码的csv文件,需要文件开头有一个UTF8 BOM标记。
3.换行问题,我们在linux里面的换行符一般是"\n"。而windows的换行是"\r\n"。最好是转换一下(测试貌似不转也能用)。
4.假如字段值内部有换行怎么办?这里就需要使用双引号包裹字段。但这又引出一个问题,字段值里面有字面量的双引号怎么处理?根据csv rfc文档,应该在字面量的双引号前多加一个双引号来处理。
处理好以上几个问题后,客户应该能直接使用excel打开csv文件了。
下面是一个生成csv的小工具:csvtool.py。
使用方法:
把csvtool.py文件下载放到一个目录,在该目录下写自己的脚本,如:
csv测试脚本
# coding=utf-8
import
csvtool
dp_id
=
'62228616'
sql
=
"SELECT \
i.customerno as
'客户ID'
, \
i.dp_id as
'店铺'
, \
min
(i.created) as
'第一次购买时间'
, \
sum
(i.total_fee) as
'开店至今购买总金额'
, \
(select m.grade
from
plt_taobao_crm_member m where m.customerno
=
i.customerno
and
m.dp_id
=
i.dp_id limit
1
) as
'会员等级'
, \
count(distinct i.tid) as
'购买次数'
, \
count(i.oid) as
'购买件数'
, \
group_concat(i.title SEPARATOR
'||'
) as
'商品名称'
\
from
plt_taobao_order_item i \
where i.dp_id
=
'%s'
and
i.ccms_order_status
=
23
and
created <
'2013-06-30 23:59:59'
\
group by i.customerno LIMIT
5
"
%
(dp_id, )
generator
=
csvtool.CSVGenerator()
generator.connect(user
=
'root'
, db
=
'ccms_gxg'
, passwd
=
'
', host='
gxg', port
=
3306
)
print
"执行查询..."
generator.query(sql)
print
"查询结束..."
generator.gencsv(
'test.csv'
)
|
初步使用功能正常。不过也许有一些隐藏bug,待大家使用发现。
本文转自 Bruceweien 51CTO博客,原文链接:http://blog.51cto.com/bruceweien/1932415