首先,还是通过export命令将某表数据导出为del格式
- -- Start of generated script for 192.168.0.85-INFO85-INFOSPY (db2inst1)
- -- Oct-11-2008 at 14:53:28
- EXPORT TO 'C:/DATA_WHITELISTS_R.del' OF DEL
- SELECT * FROM "DB2INST1"."DATA_WHITELISTS_R";
- #SYNC 10;
- -- End of generated script for 192.168.0.85-INFO85-INFOSPY (db2inst1)
通过以下程序,将这个del格式的数据进行分离
- # -*- coding: cp936 -*-
- #===============================================================================
- #开发需求:与数据时间片分析工具共同使用,该程序主要用来分析数据表del文件
- #1.可将del数据源文件,按照时间分割为新的数据文件
- #2.可将del数据源文件,按字定义大小进行分割split_record
- #===============================================================================
- import os,time
- #需要分析的del文件名
- DelName = "DATA_ALARM_BA.del"
- path = os.getcwd()+"/%s" % (DelName)
- #分析后的输出路径
- os.system("mkdir Analyse")
- analyse_path = os.getcwd()+r"/Analyse"
- #每个文件分割的大小
- split_record = 10000
- #需要分析的时间字段,比如是按del第4列数据,进行日期数据分割
- split_filed = 4
- DataObject = open(path,'r')
- Data_List = DataObject.readlines()
- print "共需要转换的总次数:",int(len(Data_List)/split_record),"表总数:",int(len(Data_List))
- for i in range(len(Data_List)):
- datatime = ""
- for y in Data_List[i].split(',')[split_filed][1:11].split('-'):
- datatime += y
- global temp
- temp = datatime
- if int(datatime)-int(temp) <> 0:
- print os.getcwd()
- os.system("md Analyse//%s" % (datatime))
- newpath = "%s//%s//%s%s_%s.del" % (analyse_path,datatime,DelName[:-4],temp,str("%04d" % (i/split_record)))
- list = open(newpath,'a')
- list.writelines(Data_List[i])
- else:
- print os.getcwd()
- print temp
- os.system("md Analyse//%s" % (temp))
- newpath = "%s//%s//%s%s_%s.del" % (analyse_path,temp,DelName[:-4],datatime,str("%04d" % (i/split_record)))
- list = open(newpath,'a')
- list.writelines(Data_List[i])
- print "转化成功"
将上段py脚本与导出DATA_ALARM_BA.del文件放置在一个目录下,分析后会创建Analyse目录
请将数据,进行手工分离:
在Analyse目录下创建时间格式为2008-10-10为例的文件夹,将分离后的分析数据归档
使用以下脚本开始分析数据:需要自行定义以下参数:
#1.设定一个分析时间片,单位为分钟,AnalyseTimeArea,默认为5分钟
#2.可设定需要分析数据库表所在字段,AnalyseField,默认为第四个字段(时间字段请确认)
- #!/usr/bin/env python
- #-*- coding: cp936 -*-
- #===============================================================================
- #开发需求:与数据分离工具共同使用,该程序主要用来分析单位时间的单表入库平均值
- #1.设定一个分析时间片,单位为分钟,AnalyseTimeArea
- #2.可设定需要分析数据库表所在字段,AnalyseField
- #===============================================================================
- import threading,os,time
- class ReadConfig():
- def Base_Config(self):
- #配置话单路径
- TelPath = os.getcwd()+"//Analyse"
- #print TelPath
- return TelPath
- class GetPath(ReadConfig):
- def Get_Path(self):
- #获取路径下分析文件,建立字典
- dict = {}
- dir_temp = []
- file_temp = []
- basepath = self.Base_Config()
- #print basepath
- for root, dirs, files in os.walk(self.Base_Config()):
- #获取文件夹节点,获取文件夹对应文件
- for dir in dirs:
- dir_temp.append(dir)
- dir_temp.sort()
- for i in dir_temp:
- #print self.Base_Config()+"//"+str(i)
- for root, dirs, files in os.walk(self.Base_Config()+"//"+str(i)):
- #获取对应文件夹下的数据
- file_temp.append(files)
- for i in range(len(dir_temp)):
- #建立数据字典
- dict[dir_temp[i]] = file_temp[i]
- return basepath,dict
- class ThreadMain(threading.Thread,GetPath):
- def __init__(self):
- #设定一个分析时间片,单位为分钟
- self.AnalyseTimeArea = 5
- #需要分析数据库表所在字段
- self.AnalyseField = 4
- basepath,dict = self.Get_Path()
- #print basepath,dict
- self.dict = dict
- self.basepath = basepath
- def Thread_Contorl(self):
- #读取字典的索引,索引为文件夹节点self.dict.keys()[i]
- self.Add_Tel_Path_temp2 = []
- #print self.dict.keys()
- for i in range(len(self.dict.keys())):
- self.Add_Tel_Path_temp1 = []
- #print self.dict.keys()[i],self.dict[self.dict.keys()[i]]
- for y in range(len(self.dict[self.dict.keys()[i]])):
- #print self.dict.keys()[i],self.dict[self.dict.keys()[i]]
- #print len(self.dict[self.dict.keys()[i]])
- self.Add_Tel_Path = self.basepath+"//"+self.dict.keys()[i]+"//"+self.dict[self.dict.keys()[i]][y]
- self.Add_Tel_Path_temp1.append(self.Add_Tel_Path)
- #print Add_Tel_Path_temp1
- self.Add_Tel_Path_temp2.append(self.Add_Tel_Path_temp1)
- #Add_Tel_Path_temp2得到已文件夹节点分类数组,格式如下[[2008-3-8],[2008-3-10],[2008-3-9]]
- return self.Add_Tel_Path_temp2
- #================================================================================
- # 已文件夹为单位进行时间分割计算每日的话单总流量
- # Method Name:AnalyseMethod_Countdayflow
- # Author:xinkai Add:2008-3-10
- #================================================================================
- def AnalyseMethod_Countdayflow(self):
- self.CountFlow = 0
- #由线程类获得分析数组
- self.AnalyseList = self.Thread_Contorl()
- #print AnalyseList
- for i in range(len(self.AnalyseList)):
- #print self.dict.keys()[i],AnalyseList[i]
- #===============================================================================
- # 此处需要加判断日期以及有效话单
- #===============================================================================
- for y in range(len(self.AnalyseList[i])):
- #print AnalyseList[i][y]
- self.AnalyseData = open(self.AnalyseList[i][y],'r')
- #self.CountFlow += len(self.AnalyseData.readlines())
- print "执行过程[ %s ]:第%s文件大小为%s文件" % (self.dict.keys()[i],y,len(self.AnalyseData.readlines()))
- self.CountFlow += len(self.AnalyseData.readlines())
- #print self.dict.keys()[i]+str(len(AnalyseData.readlines()))+"/n"
- #print "[",self.dict.keys()[i]+" ]当日数据总流量为:"+str(self.CountFlow)
- #================================================================================
- # 已文件夹为单位进行时间分割按照划定的时间片对每日话单分时流量进行统计
- # Method Name:AnalyseMethod_CountTimeFlow
- # Author:xinkai Add:2008-3-10
- #================================================================================
- def AnalyseMethod_CountTimeFlow(self):
- #Analyse_CountTimeFlow = open('Analyse_CountTimeFlow.log','w')
- #由线程类获得分析数组
- self.AnalyseList = self.Thread_Contorl()
- for i in range(len(self.AnalyseList)):
- temp = []
- self.AnalyseStack = []
- self.AnalyseStackSend = []
- for y in range(len(self.AnalyseList[i])):
- #已时间文件夹为分割点,分类读取话单进行分析
- #用来计算每个文件中每个话单记录的时间堆栈
- self.AnalyseData = open(self.AnalyseList[i][y],'r')
- self.AnalyseStackSend.append(self.AnalyseData.readlines())
- #用来计算基础时间轴的堆栈AnalyseStack
- self.AnalyseData = open(self.AnalyseList[i][y],'r')
- self.AnalyseStack.append(self.AnalyseData.readlines()[0])
- #已文件夹时间点分割,获取基础时间轴
- self.BaseTimeCenter = self.AnalyseStack[0].split(',')[self.AnalyseField]
- #转化话单发送时间为整数
- self.ChangeBaseTime = self.ChageTime(self.BaseTimeCenter)
- for h in range(len(self.AnalyseList[i])):
- for z in self.AnalyseStackSend[h]:
- self.TelTime = self.ChageTime(z.split(',')[self.AnalyseField])
- #print str(self.TelTime)+""+str(self.ChangeBaseTime)
- import math
- #获得已基础时间为轴的时间差值
- #print int(math.fabs(self.TelTime - self.ChangeBaseTime))/60
- temp.append((int(math.fabs(self.TelTime - self.ChangeBaseTime))/60) / self.AnalyseTimeArea)
- #Analyse_CountTimeFlow.writelines("话单时间:%s/n初始时间片 时间片 分时流量/n" % (self.dict.keys()[i]))
- #Analyse_CountTimeFlow.close()
- print self.BaseTimeCenter[1:11]
- for j in range(1440/int(self.AnalyseTimeArea)):
- if temp.count(j) <> 0:
- #Analyse_CountTimeFlow = open('Analyse_CountTimeFlow.log','a')
- print "分析日期:%s ; 分析时间片:%s分钟 ; 第%s时间片 ; 分时流量为%s条 ;" % (self.BaseTimeCenter[1:11],self.AnalyseTimeArea,j,temp.count(j))
- #Analyse_CountTimeFlow.writelines("%s %s %s/n" % (self.AnalyseTimeArea,j,temp.count(j)))
- def ChageTime(self,datatime):
- #初始化变量
- self.YearMD = ""
- self.TimeCS = ""
- #引用时间参数
- self.datatime = datatime
- self.SplitDataTime2 = self.datatime[1:11].split('-')
- self.SplitDataTime3 = self.datatime[12:20].split('.')
- #分割结果['2008', '03', '10'] ['11', '18', '18']
- #组合分割数据转换时间为整数
- for i in self.SplitDataTime2:
- self.YearMD += i
- for h in self.SplitDataTime3:
- self.TimeCS += h
- self.newTime = self.YearMD + self.TimeCS
- return int(self.newTime)
- def __del__(self):
- pass
- class ControlThread(ThreadMain):
- def __init__(self):
- basepath,dict = self.Get_Path()
- self.dict = dict
- self.basepath = basepath
- def Control_Thread(self):
- #控制使用分析线程
- print "-----------------------------------------"
- ObjectThread = ThreadMain()
- print "开始计算每日流量:"
- ObjectThread.AnalyseMethod_Countdayflow()
- print "计算结束"
- print "-----------------------------------------"
- import time
- time.sleep(0.01)
- print "开始计算分时流量:"
- ObjectThread.AnalyseMethod_CountTimeFlow()
- print "计算结束"
- print "-----------------------------------------"
- if __name__ == "__main__":
- ObjectControl = ControlThread()
- ObjectControl.Control_Thread()
- #path = ReadConfig(path)
这里的重点,你可以根据自己数据的特点,重新定义。
self.SplitDataTime2 = self.datatime[1:11].split('-')self.SplitDataTime3 = self.datatime[12:20].split('.')
#分割结果['2008', '03', '10'] ['11', '18', '18']
运行程序后,会生成以下日志:
- 分析后数据如下:
- -----------------------------------------
- 开始计算每日流量:
- 执行过程[ 20080930 ]:第0文件大小为4文件
- 执行过程[ 20080929 ]:第0文件大小为103文件
- 计算结束
- -----------------------------------------
- 开始计算分时流量:
- 2008-09-30
- 分析日期:2008-09-30 ; 分析时间片:5分钟 ; 第0时间片 ; 分时流量为4条 ;
- 2008-09-29
- 分析日期:2008-09-29 ; 分析时间片:5分钟 ; 第0时间片 ; 分时流量为95条 ;
- 分析日期:2008-09-29 ; 分析时间片:5分钟 ; 第1时间片 ; 分时流量为4条 ;
- 分析日期:2008-09-29 ; 分析时间片:5分钟 ; 第2时间片 ; 分时流量为4条 ;
- 计算结束
- -----------------------------------------