先吐槽一下辣鸡百统...太难用了。
然后进入正题
业务需求主要分2类:urls,events
百统选中日期段时,导出csv文件会将时间段内的所有数据合并;
业务场景对数据的处理通常以自然日为单位;
于是只能每天导出1份csv文件。
但是这样导出的文件,首列为序号1,2,3,4,不包含日期。
例如:
事件类型 | 事件总数 | 唯一访客事件数 | 事件价值 | |
总计 | 4 | 5 | 6 | |
1 | a | 1 | 2 | 3 |
2 | b | 1 | 2 | 3 |
3 | c | 1 | 2 | 3 |
期望转制成
日期 | 事件类型 | 事件总数 | 唯一访客事件数 | 事件价值 | 平均价值 |
20170822 | 总计 | 4 | 5 | 6 | 0 |
20170822 | a | 1 | 2 | 3 | 0 |
20170822 | b | 1 | 2 | 3 | 0 |
20170822 | c | 1 | 2 | 3 | 0 |
主要需求:
匹配指定文件
为首列写入日期
输出
Events部分
文件命名格式
事件统计_yyyymmdd-yyyymmdd.csv
1.
新建python文件csvtool.py
定义一个输出方法
#!/usr/bin/python
#-*- coding:UTF-8 -*-
#python2.7
import csv #读写csv
import re #匹配文件名
import os #计算path
import sys #设定默认编码
def csv_writer(filepath, lists, fileheader):
#命中目标文件
csvFile = open(filepath,'w') # encoding='utf-8'
writer = csv.writer(csvFile)
# 写入内容
if fileheader:
writer.writerow(fileheader)
for item in lists:
writer.writerow(item)
csvFile.close()
由于首次转制,数据较多,合并到同一个csv中输出,比较容易导入mysql
def collect_csvs(resource,target): #合并csv文件为1个
print(resource)
if os.path.isdir(resource): # 检验目录是否有误
print ("Resource dir exists!")
else:
print ("Resource dir not exists")
exit()
result = [] #收集csv数据
fileheader = [] #定义csv文件头,可选
filelists = os.listdir(resource)
for file in filelists:
tt_match = re.search(r'_(.+?)-', file) #输入正则匹配需要的文件名
if tt_match:
print("===start proceed " + file + "===")
# 获取日期
key = tt_match.group(1) #根据正则获取到的关键命名词
print("====rename key is " + key + " ===")
# 开始读取file
csvfile = open(os.path.join(resource, file), 'r')
reader = csv.reader(csvfile)
index = 1
# 获取file中的数据
for item in reader:
# 第一行为列头
if reader.line_num == 1:
print("===item1 is " + str(item) + " ===")
fileheader = item
s = u'日期'
fileheader[0] = s.decode('utf-8').encode('gb2312') #csv文件默认是acsii编码,中文环境下重encode为gb2312才不会乱码。
continue
if item: # 判断是否为空行 ,不能完全判断,部分空行为['','','','']
index = index + 1
item[0] = key # 按需在首列填充关键词
result.append(item) # 写入数组
print("===total " + str(index) + " items comopleted")
# 关闭file
csvfile.close()
print("=====" + file + " close======")
# 开始重写csv
csv_writer(os.path.join(target, key + ".csv"), result, fileheader)
print("===" + key + ".csv completed===")
2.定义好方法后,调用
reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())
resource = "/home/ubuntu/csvtool/source/" #文件目录
target = "/home/ubuntu/csvtool/target/" #输出目录
collect_csvs(resource,target)
print("===Congratulations! collect_csvs is compeleted smoothly===")
这样所有resource目录下的*.csv都会合并到最后的key.csv中,用mysql自带的csv导入工具即可完成任务。
3.
后续维护时,每日只有1张基础event表,不需要做批量合并,可以采用1对1转制方法,规范命名、存档。
def change_csvs(resource,target): #将csv文件1对1重写成另外一批csv文件
if os.path.isdir(resource): # 检验目录是否有误
print ("Directory exists!")
else:
print ("Directory not exist.")
time.sleep(5)
exit()
filelists = os.listdir(resource)
for file in filelists:
tt_match = re.search(r'_(.+?)-', file) #输入正则匹配需要的文件名
if tt_match:
print("===start proceed " + file + "===")
# 获取日期
key = tt_match.group(1) #根据正则获取到的关键命名词
print("====rename key is " + key + " ===")
# 开始读取file
result = [] # 收集csv数据,先重置
csvfile = open(os.path.join(resource, file), 'r')
reader = csv.reader(csvfile)
index = 1
# 获取file中的数据
for item in reader:
# 写入第一行为列头
if reader.line_num == 1:
print("===item1 is " + str(item) + " ===")
fileheader = [] # 定义csv文件头,可选
fileheader = item
s = u'日期'
fileheader[0] = s.decode('utf-8').encode('gb2312') #csv文件默认是acsii编码
# print("=====headers = " + fileheader[0] + " ======")
continue
if item: # 判断是否为空行 ,不能完全判断,部分空行为['','','','']
index = index + 1
item[0] = key # 按需在首列填充关键词
result.append(item) # 写入数组
print("===total " + str(index) + " items comopleted")
# 开始重写csv
csv_writer(os.path.join(target, key + ".csv"), result, fileheader)
print("===" + key + ".csv completed===")
# 关闭file
csvfile.close()
print("=====" + file + " close======")
然后写入
resource = "/home/ubuntu/csvtool/source/" #文件目录
target = "/home/ubuntu/csvtool/target/" #输出目录
change_csvs(resource,target)
print("===Congratulations! change_csvs is compeleted smoothly===")
这样所有 yyyymmdd-yyyymmdd.csv都会被重写成 yyyymmdd.csv
4.优化
其实导出的csv中,列名不是必须的,预先在数据库中设计好表,可以省去列名;
对多个网站做数据管理时,输出文件名需要为 网站名称_yyyymmdd.csv,不然会混乱;
其实完全可以直接在python中conn数据库然后写入数据,不需要导出csv再手动转入【单纯想练手......
urls部分再补。
说到这里就想吐槽一个无脑的可视化工具bdp,号称个人版免费,支持一大堆常用数据源等。
使用一段时间后被迫放弃。
比如如链接友盟,经常有数据丢失,比如07.01-08.31,中间莫名丢失几天的数据。
再比如不支持百统的事件统计。
比如链接百统的urls表时,筛选关键词出来的浏览数据会<<百统后台直接搜索。
比如...
一开始完全没有察觉,结果用了好久才有种上当的感觉。回头看以前的报表几乎满满都是坑。
虽然百统自己本身也是完全不准确的,经常出现子方法uv>>父事件等......