運維經常遇到客戶要求下載某些數據列表的需求。一般我們是提供一個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,待大家使用發現。