csv文件生成小工具

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章