先描述一下情境,市場部的同事最近在搞活動,前一個周的總的代金券領取量不及最後一天領取量,於是讓我來查一下此次代金券的詳細情況,包括但不限於:1、十萬張代金券都被哪些使用者領取了?2、根據使用者領取的從多到少排一下序。3、已經有哪些代金券使用了?4、使用代金券的交易總額多少?附件中是一個十萬行的文本,每行是一個代金券的編號。
首先要做的是分析市場部同事的要求,我大約需要做如下幾件事:第一,找出哪些代金券已經被使用者領取。第二,根據使用者算出領取的使用者各自領取了多少張代金券。第三,哪些代金券在交易中已經使用了,交易的詳情。第四,領取代金券的使用者哪些在黑名單中?第五,黑名單以外的使用者註冊的時間及註冊使用的IP資訊。
由於代金券編號是按行存的,所以寫個按行讀取編號的PY檔案,組織成查詢哪些被使用者領取的SQL語句,再批量執行SQL語句,於是第一個py檔案getIdCountSql.py產生了:
#!/usr/bin/env python#coding=utf-8import sysimport os if __name__ == "__main__": if len(sys.argv) != 2: print "Usage: python getNum.py [target file]\n" print "Example: python ", sys.argv[0] , "code.txt" sys.exit(1) filename = sys.argv[1] if os.path.exists(filename): file_object = open(filename) lines = file_object.readlines() for line in lines: line = line.strip('\n') # 去掉尾部的換行 print "select id, count from tb_gift where code='%s' ;" % line file_object.close()
執行 python getIdCountSql.py code.txt >getIdCount.sql
於是產生了一個sql指令碼如下:
select id, count from tb_gift where code='code123' ;
select id, count from tb_gift where code='code12' ;
select id, count from tb_gift where code='code456' ;
執行SQL指令碼,並把結果寫入一個文字檔: mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB < getIdCount.sql > giftIdCount.txt
此時會產生一個帶列頭的文字檔類似:id count
code123 1
id count
code12 1
此時雖然可以處理,但是每行都存在的列名讓人總覺得不爽,於是查閱資料,把列名去掉了:mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB --disable-column-names < getIdCount.sql
> giftIdCount.txt
這樣文字檔行數成了剛才檔案的一半code123 1
code121
下面統計被啟用的代金券,即第二列為1的,於是有了第二個PY檔案:
#!/usr/bin/env python
#coding=utf-8
import sys
import os
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "a.txt"
sys.exit(1)
filename = sys.argv[1]
map = {}
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
line = line.strip('\n') # 去掉尾部的換行
cols = line.split('\t') # 文本是以Tab為分隔字元
if len(cols) == 2 and cols[0] != "id" and cols[1] == '1':
print "select user_id from tb_user_gift where id = %s ;" % cols[0]
file_object.close()
執行python getUserIdSql.py giftIdCount.txt > getUserId.sql產生第二批sql語句,執行mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB --disable-column-names < getUserId.sql > userId.txt取得結果如下:1113222123統計使用者資訊statisticUserIds.py:#!/usr/bin/env python
#coding=utf-8
import sys
import os
def parse_line(line):
# user_id
#11132
# 第一行忽略,針對帶列名的資料,不帶列名的沒有第一行,第二行為使用者的id,數量為1
try:
result = {}
if not line or line.find("user_id") != -1 :
return 0,0
else:
line = line.strip('\n')
productId = line
num = 1
return productId, num
except Exception, msg:
print msg,',line = ', line
return 0, 0
def reverse_numeric(x, y):
return y[1]- x[1]
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "a.txt"
sys.exit(1)
filename = sys.argv[1]
map = {}
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
#print 'current line =', line
productId, num = parse_line(line)
count = map.get(productId)
if count:
map[productId] = count + int(num)
else:
map[productId] = int(num)
arr = [ v for v in sorted(map.items(), cmp=reverse_numeric)]
print arr
執行python statisticUserIds.py userId.txt > userCount.txt統計資訊如下: ('11132', 5), ('22123', 3), ('110', 1)
這樣就有了使用者的統計資訊了,下次講交易的資訊
上一篇:Mysql初始化root密碼和允許遠端存取
下一篇:CSDN資源頁面掛掉了?
-
頂
-
2
-
踩
-
0