def decoding(self): '''/ decoding规则如下: ''' #1:objtype开始标识 A2 80 13。 #2:该objtype 包含的counter名称。第一位是标识counter长度,后边几位是counter名称,直到出现00 00 A3 80,才结束counter定义 #3:继续往下读3位,判断该objtype是否定义有数据: 30 80 80是存在数据, 其他是不存在数据,可忽略该objtype。 #4:定义小区。和Counter名称一样,第一位是长度,后边是名称,其中名称是由objtype+Cell来命名 #5:开始取值。标识:A1 80 , 紧接着的80是表示开始取值,在后一位是值的长度,后边就是具体的数值。 #6:到出现00 00 82 01 00 00 00 表示一行数据取完 #7:接着30 80 80,就开始下一个小区数据 #8:如果出现00 00 82 01 00 00 00,但接着的不是30 80 80,那表示这一objtype数据取完,然后就判断下一个A2 80 13, 重复1-8的过程。 try: filestring = self.__file filename = self.__filename s_filenamewithoutpath = filename.split('\\')[-1] s_ne = s_filenamewithoutpath.split('_')[-2] if(len(self.__file)>0): s_timestart = filestring[46:46+12] s_timeend = filestring[79:79+12] s_date = s_timestart[0:8] if(s_timestart[10:12] == "00" and s_timeend[10:12] == "00"): #s_period = str(int(s_timestart[8:10])+8)+'00-'+str(int(s_timeend[8:10])+8)+'00' s_period = str(int(s_timestart[8:10])+8) i_pos = 96 while(i_pos < len(self.__file)): if((binascii.hexlify(filestring[i_pos]) == "a2") and(binascii.hexlify(filestring[i_pos+1]) == "80") and(binascii.hexlify(filestring[i_pos+2]) == "13")): i_pos = i_pos+3 #定义一个字典类型的 d_dictionary = {} d_dictionary["ID"] = "" d_dictionary["NE"] = "" d_dictionary["MO"] = "" d_dictionary["DATE"] = "" d_dictionary["PERIOD"] = "" d_dictionary["PERLEN"] = "" #在每个OT的字段定义处循环 ot_columnname = [] s_counternamelen = int(binascii.hexlify(filestring[i_pos]) , 16) #将字典的key存入列表中 ot_columnname.append("ID") ot_columnname.append("NE") ot_columnname.append("MO") ot_columnname.append("DATE") ot_columnname.append("PERIOD") ot_columnname.append("PERLEN") ot_columnname.append(filestring[i_pos+1:i_pos+1+s_counternamelen]) i_pos = i_pos+s_counternamelen+2#加一的目的是过滤掉无用的字符 while(binascii.hexlify(filestring[i_pos-1]) != "00" and binascii.hexlify(filestring[i_pos]) != "00" and binascii.hexlify(filestring[i_pos+1]) != "a3" and binascii.hexlify(filestring[i_pos+2]) != "80"): s_counternamelen = int(binascii.hexlify(filestring[i_pos]) , 16) ot_columnname.append(filestring[i_pos+1:i_pos+1+s_counternamelen]) i_pos = i_pos+s_counternamelen+2#加一的目的是过滤掉无用的字符 i_pos = i_pos+3#游标走到OT定义判断 s_objlev = "" #下边判断该OT是否定义,如定义,开始取数据;如果没有定义,位置加1,判断标志:30 80 80 if(binascii.hexlify(filestring[i_pos]) == "30" and binascii.hexlify(filestring[i_pos+1]) == "80" and binascii.hexlify(filestring[i_pos+2]) == "80"): s_flag_ot = False while(binascii.hexlify(filestring[i_pos]) == "30" and binascii.hexlify(filestring[i_pos+1]) == "80" and binascii.hexlify(filestring[i_pos+2]) == "80" and s_objlev != "NODEF"): i_pos = i_pos+3 s_otmolen = int(binascii.hexlify(filestring[i_pos]) , 16) s_otmo = filestring[i_pos+1:i_pos+1+s_otmolen] s_objtypename = s_otmo.split('.')[0] s_mo = s_otmo.split('.')[1] #如果 ObjType Excel中定义了该 ObjType,那么进行处理 if(OBJ_LEVEL_DICTIONARY.has_key(s_objtypename)): s_objlev = OBJ_LEVEL_DICTIONARY[s_objtypename] d_dictionary["TableName"] = s_objtypename d_dictionary["NameSpace"] = s_objlev if(s_flag_ot == False): DICTIONARY_OT[d_dictionary["TableName"]] = [] s_flag_ot = True else: pass #try: #d_dictionary["ID"] = s_ne+s_mo+"0"+s_date+s_period d_dictionary["ID"] = str(uuid.uuid4()) d_dictionary["NE"] = s_ne d_dictionary["MO"] = s_mo d_dictionary["DATE"] = s_date d_dictionary["PERIOD"] = s_period d_dictionary["PERLEN"] = "60" #转到判断是否开始取值处 i_pos = i_pos+int(binascii.hexlify(filestring[i_pos]) , 16)+1 if(binascii.hexlify(filestring[i_pos]) == "a1" and binascii.hexlify(filestring[i_pos+1]) == "80"): i_pos = i_pos+2 i_data = 6 while(binascii.hexlify(filestring[i_pos]) != "00" or binascii.hexlify(filestring[i_pos+1]) != "00" or binascii.hexlify(filestring[i_pos+2]) != "82" or binascii.hexlify(filestring[i_pos+3]) != "01" or binascii.hexlify(filestring[i_pos+4]) != "00" or binascii.hexlify(filestring[i_pos+5]) != "00" or binascii.hexlify(filestring[i_pos+6]) != "00"): i_value = 0 if(binascii.hexlify(filestring[i_pos]) == "80"): i_pos = i_pos+1#游标转移到counter的值长度位置上 s_coutervaluelen = int(binascii.hexlify(filestring[i_pos]) , 16) for i in range(1 , s_coutervaluelen+1): i_value = i_value+ int(binascii.hexlify(filestring[i_pos+i]) , 16)*pow(16 , 2*(s_coutervaluelen-i)) d_dictionary[ot_columnname[i_data]] = str(i_value) i_pos = i_pos+s_coutervaluelen+1 i_data = i_data+1 elif(binascii.hexlify(filestring[i_pos]) == "82"): d_dictionary[ot_columnname[i_data]] = "0" i_pos = i_pos+2 i_data = i_data+1 else: i_pos = i_pos+1 #增加guid if (binascii.hexlify(filestring[i_pos]) == "00" and binascii.hexlify(filestring[i_pos+1]) == "00" and binascii.hexlify(filestring[i_pos+2]) == "82" and binascii.hexlify(filestring[i_pos+3]) == "01" and binascii.hexlify(filestring[i_pos+4]) == "00" and binascii.hexlify(filestring[i_pos+5]) == "00" and binascii.hexlify(filestring[i_pos+6]) == "00"): i_pos = i_pos+7#走到下一行数据 #将数据加入到DICTIONARY_OT length = len(ot_columnname) templist = [] removed_list = [] ot_columnname_cp = [] ot_columnname_cp.extend(ot_columnname[6:]) for i in range(0 , length): #从definition定义的字典中获取存在的counter不存在的counter直接pass掉 if(i < 6): templist.append(d_dictionary[ot_columnname[i]]) elif(i >= 6): if(COUNTER_OT_DICTIONARY[OBJ_LEVEL_DICTIONARY[s_objtypename]].has_key(ot_columnname[i]) == True): templist.append(d_dictionary[ot_columnname[i]]) else: removed_list.append(ot_columnname[i]) #将OT的属性放进ot_columnname_cp 以便生成字典 进行搜索,记下当前OT对应的属性属性 for i in range(0 , len(removed_list)): ot_columnname_cp.remove(removed_list[i]) #将不同的OT的 属性保存 s_index = OBJ_LEVEL_DICTIONARY[s_objtypename] if(DICTIONARY_OT_COLUMNNAME[s_index].has_key(s_objtypename) == False): DICTIONARY_OT_COLUMNNAME[s_index][s_objtypename] = ot_columnname_cp #DICTIONARY_OT里面包含的是所有的OT类型下面所对应的链表 每一个链表都是这个OT字典所对应的数据 DICTIONARY_OT[d_dictionary["TableName"]].append(templist) else: s_objlev = "NODEF" i_pos = i_pos+1 except: EXCEPTION_MESSAGE.append("there exists problems while decoding the data ")
def sameleveltableintoonetable(self): ''' 首先需要调用 self.decode() 进行解析 其次调用self.objtype_into_samelevlist()进行OT汇总 之后调用此函数进行写不同level文件 ''' try: #同一种的OT属性进行输出 , 为了入数据库 leveltype_len = len(LEVELTYPE_LIST) ''' 修改日期:2012/12/12 增加一个字典来关联属性和value之间的关系 ''' ###################################### column_value_map = {} for index in range (0 , leveltype_len): column_value_map[LEVELTYPE_LIST[index]] = {} ###################################### for i in range (0 , leveltype_len): countercolumnname_for_level = [] countercolumnname_for_level.append("ID") countercolumnname_for_level.append("NE") countercolumnname_for_level.append("MO") countercolumnname_for_level.append("DATE") countercolumnname_for_level.append("PERIOD") countercolumnname_for_level.append("PERLEN") DICTIONARY_COUNTERCOLUMNNAME_FOR_EACHLEVEL[LEVELTYPE_LIST[i]].extend(countercolumnname_for_level) for j in range(0 , len(DICTIONARY_LIST_OT_NAME[LEVELTYPE_LIST[i]])): DICTIONARY_COUNTERCOLUMNNAME_FOR_EACHLEVEL[LEVELTYPE_LIST[i]].extend(DICTIONARY_OT_COLUMNNAME[LEVELTYPE_LIST[i]][DICTIONARY_LIST_OT_NAME[LEVELTYPE_LIST[i]][j]]) DICTIONARY_COUNTERCOLUMNNAME_FOR_EACHLEVEL[LEVELTYPE_LIST[i]].append("GUID") #################################################################################### for level in LEVELTYPE_LIST: for column_index in range(0, len(DICTIONARY_COUNTERCOLUMNNAME_FOR_EACHLEVEL[level])): column_value_map[level][DICTIONARY_COUNTERCOLUMNNAME_FOR_EACHLEVEL[level][column_index]] = column_index #################################################################################### self.__openfile() for i in range(0 , leveltype_len):#遍历有几种LEVEL类型 if(len(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]])>0): #j表示OT里面每张表的长度,同一个OT里面的表的长度是相同的 for j in range(0 , len(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0])): counter_data = [] counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][0]) counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][1]) counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][2]) counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][3]) counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][4]) counter_data.append(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][0][j][5]) for k in range(0 , len(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]])):#k指同一个oT的表的个数 try: counter_data.extend(DICTIONARY_LEVEL_TO_OTLIST[LEVELTYPE_LIST[i]][k][j][6:]) except IndexError: print "index error" WARNING_MESSAGE.append("the same OT tables with different lines numbers ") pass counter_data.append(self.__guid) ''' 修改日期:2012/12/12 按照需要针对counter_data进行排列,即按照建表的顺序进行 ''' ############################################################################################################### counter_data_by_order = [] counter_data_by_order.append(counter_data[0]) counter_data_by_order.append(counter_data[1]) counter_data_by_order.append(counter_data[2]) counter_data_by_order.append(counter_data[3]) counter_data_by_order.append(counter_data[4]) counter_data_by_order.append(counter_data[5]) for index in range(0, len(FILETABLE[LEVELTYPE_LIST[i]])): if column_value_map[LEVELTYPE_LIST[i]].has_key(FILETABLE[LEVELTYPE_LIST[i]][index]): couter_index = column_value_map[LEVELTYPE_LIST[i]][FILETABLE[LEVELTYPE_LIST[i]][index]] counter_data_by_order.append(counter_data[couter_index]) else: counter_data_by_order.append("") counter_data_by_order.append(counter_data[-1]) ############################################################################################################### self.__insertdataintofile(LEVELTYPE_LIST[i], counter_data_by_order) self.__closefile() except: EXCEPTION_MESSAGE.append("there exists problems in sameleveltableintoonetable() ")