如果用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。
使用方法:
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,待大家使用發現。
C 檔案複製小工具
60string newfile 定義儲存的位置,和儲存的名稱 61 62for inti 1 i convert.toint32 textbox2.text i 從textbox2中獲取要複製的次數 63 67messagebox.show 複製完成 68 69 70 view source pr...
檔案編碼解碼小工具
base64編碼解碼原理 base64編碼是用64個可見字元表示任意二進位制資料的方法。以3個8bit的字元為一組,針對每組獲取每個字元的ascii編碼,將ascii編碼轉換成8bit的二進位制,得到一組24bit的位元組 將24bit劃分為4個6bit的位元組,每個6bit的位元組高兩位補0,得到...
間隔刪除檔案小工具
工具介面如下,實現功能為一定的間隔刪除或者移動檔案。核心 如下 todo 在此新增命令處理程式 ifdef need dir cstring strdir getdlgitemtext idc edit dir,strdir if strdir.getlength else tstring sdir...