#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package PythonData  
 | 
#  
 | 
# @todo:PY¶Á±íÆ÷  
 | 
# @author hxp  
 | 
# @date 2016-01-26  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: PY¶Á±íÆ÷  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2016-01-26 15:00"""  
 | 
#---------------------------------------------------------------------  
 | 
#µ¼Èë  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
import copy  
 | 
import os  
 | 
#---------------------------------------------------------------------  
 | 
#È«¾Ö±äÁ¿  
 | 
  
 | 
FIELD_LINE = 1              #±ê³ö×Ö¶ÎÃûµÄÐкŠ 
 | 
EFFECT_START_LINE = 3       #ÓÐЧÄÚÈÝÆðʼÐкÅugOutput(str(info))  
 | 
     
 | 
##ʦ籒ˈ  
 | 
#  
 | 
# ¶ÁÈ¡±íÊý¾Ý£¬Ö§³Ö¸÷ÖÖ½Ó¿Ú²éѯ±íÊý¾Ý£¬½Ó¿ÚÔÚÄ£¿éĩβÓÐ×¢ÊÍ  
 | 
class FileData:  
 | 
      
 | 
    ## ¶Áȡָ¶¨µÄ±íµÄÄÚÈݲ¢±£´æÆðÀ´  
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ·µ»ØÖµ  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£º  
 | 
    def __init__(self, filePath, filedLine=FIELD_LINE, StartLine=EFFECT_START_LINE):  
 | 
        self.fieldList = []                               #×Ö¶ÎÃûÁÐ±í  
 | 
        self.lineCount = 0                                #×ÜÓÐЧÐÐÊý  
 | 
        self.contentList = []                             #ÄÚÈÝÁÐ±í  
 | 
          
 | 
        #¶¯Ì¬ÉèÖÃÆðʼÐкÍ×Ö¶ÎÐÐ  
 | 
        self.fieldLine = filedLine  
 | 
        self.effectStartLine = StartLine  
 | 
        self.filePath = filePath  
 | 
        self.__CreateContent(self.__OpenFileData(filePath))  
 | 
        return  
 | 
  
 | 
    ## ¶ÁÈ¡Êý¾Ý  
 | 
    #  @param filePath: Îļþ  
 | 
    #  @return ÎļþÄÚÈÝ  
 | 
    def __OpenFileData(self, filePath):  
 | 
        curPath = ChConfig.GetAppPath() + "\\" + filePath  
 | 
          
 | 
        if not os.path.isfile(curPath):  
 | 
            GameWorld.ErrLog('δ·¢ÏÖÄ¿±êÎļþ = %s,%s' % (filePath , curPath))  
 | 
            raise Exception ('δ·¢ÏÖÄ¿±êÎļþ = %s,%s' % (filePath , curPath))  
 | 
          
 | 
        # ÒÔ¶þ½øÖƶÁÈ¡  
 | 
        fileObj = open(curPath, 'rb')  
 | 
        strMsg = fileObj.read()  
 | 
        fileObj.close()  
 | 
        return strMsg  
 | 
      
 | 
      
 | 
    ## Éú³ÉÄÚÈÝ×Öµä  
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ·µ»ØÖµ  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£º¶ÁÎı¾ÄÚÈÝת»¯³ÉÐÐ×ÖµäµÄÁÐ±í  
 | 
    def __CreateContent(self, content):  
 | 
        infoList = content.split('\r\n')   #²ð·ÖÐÐ  
 | 
        for i in range(len(infoList)):  
 | 
            info = infoList[i]  
 | 
            if not info:  
 | 
                continue  
 | 
              
 | 
            rowList = info.split('\t')  #ÐÐÁÐ±í£¬Ã¿Ò»ÐÐ  
 | 
              
 | 
            #×Ö¶ÎÃûËùÔÚÐÐ  
 | 
            if i == self.fieldLine:  
 | 
                self.fieldList = rowList[:]    #×Ö¶ÎÁÐ±í  
 | 
            #ÓÐЧÄÚÈÝÐÐ  
 | 
            if i >= self.effectStartLine:  
 | 
                #ÐÐÄÚÈÝÁÐÊýСÓÚ×Ö¶ÎÃû¸öÊý  
 | 
                if len(rowList) != len(self.fieldList):  
 | 
                    GameWorld.ErrLog("%s ÄÚÈÝÊýÓë×Ö¶ÎÊý²»ÏàµÈ, line=%s" % (self.filePath, i + 1))  
 | 
                    raise Exception ("%s ÄÚÈÝÊýÓë×Ö¶ÎÊý²»ÏàµÈ, line=%s" % (self.filePath, i + 1))  
 | 
                  
 | 
                rowDic = {}  #ÐÐ×Öµä  
 | 
                for j in range(len(self.fieldList)):  
 | 
                    if rowList[j] == '-':  
 | 
                        rowDic[self.fieldList[j]] = ''  
 | 
                    else:  
 | 
                        rowDic[self.fieldList[j]] = rowList[j]  
 | 
                self.contentList.append(rowDic)  #Ìí¼ÓÄÚÈÝÁÐ±í  
 | 
                  
 | 
        self.lineCount = len(self.contentList)  
 | 
        GameWorld.Log("¼ÓÔØPY±íÊý¾Ý: %s, ÄÚÈÝÌõÊý=%s" % (self.filePath, self.lineCount))  
 | 
        return  
 | 
      
 | 
    #================================================================================  
 | 
      
 | 
    ## Í¨¹ý×Öµä²éѯ  
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ·ûºÏÌõ¼þµÄÐÐÁÐ±í  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£ºÍ¨¹ý×Öµä²éѯ¿ÉÒÔ°üº¬¶à¸ö²éѯÌõ¼þ  
 | 
    def GetRecordByDic(self, searchDic, getRecordCnt=0):  
 | 
        resultList = []  #½á¹ûÁÐ±í  
 | 
          
 | 
        #´«ÈëµÄ²ÎÊý²»ÊÇ×Öµä  
 | 
        if type(searchDic) != type({}):  
 | 
            return resultList  
 | 
          
 | 
        count = self.GetRecordCount()  
 | 
        #±éÀúÄÚÈÝÁÐ±í  
 | 
        for i in range(count):  
 | 
            rowDic = self.contentList[i]  #ÐÐ×Öµä  
 | 
              
 | 
            isCorrectResult = True  
 | 
            for key in searchDic:  
 | 
                #ÐÐ×ÖµäÀïÎÞ²éѯ×ÖµäÖеļü  
 | 
                if key not in rowDic:  
 | 
                    return []  
 | 
                #²éѯ×ֶεÄÖµ²»·û  
 | 
                if searchDic[key] != rowDic[key]:  
 | 
                    isCorrectResult = False  
 | 
                    break  
 | 
                  
 | 
            #±¾ÐзûºÏ²éѯÌõ¼þ  
 | 
            if isCorrectResult:  
 | 
                resultList.append(rowDic)  
 | 
                if getRecordCnt > 0 and len(resultList) >= getRecordCnt:  
 | 
                    break  
 | 
          
 | 
        # ·µ»Ø½á¹û½øÐÐÉ±´£¬·ÀÖ¹»ù±íÊý¾Ý±»ÐÞ¸Ä  
 | 
        return copy.deepcopy(resultList)  
 | 
      
 | 
    ## Í¨¹ýij¸ö×ֶβéѯ     
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ·ûºÏÌõ¼þµÄÐÐÁÐ±í  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£ºÍ¨¹ýij¸ö×ֶεÄֵΪ¶àÉÙ½øÐеIJéѯ  
 | 
    def GetRecord(self, fieldName, value, getRecordCnt=0):  
 | 
        return self.GetRecordByDic({fieldName:str(value)}, getRecordCnt)  
 | 
      
 | 
    ## ·µ»ØÓÐЧÄÚÈÝÌõÊý  
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ÌõÊý  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£º  
 | 
    def GetRecordCount(self):  
 | 
        return self.lineCount  
 | 
      
 | 
    ## Í¨¹ýË÷Òý·µ»ØÄÚÈÝ  
 | 
    #  @param ²ÎÊý  
 | 
    #  @return ·µ»ØÖµ  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷£º  
 | 
    def GetRecordByIndex(self, index):  
 | 
        # ·µ»Ø½á¹û½øÐÐÉ±´£¬·ÀÖ¹»ù±íÊý¾Ý±»ÐÞ¸Ä  
 | 
        return copy.deepcopy(self.contentList[index])  
 | 
              
 | 
#----------------------------½Ó¿ÚʹÓÃ˵Ã÷-------------------------------  
 | 
#½Ó¿Ú£ºGetRecordByDic£¨searchDic£© Í¨¹ýÒ»¸ö×Öµä²éѯÊý¾Ý  
 | 
#        ²ÎÊý£ºÒ»¸ö²éѯ×ֵ䠠È磺{'FrmName':'frmIndividualRankEx','FunctionID':'2'} ×Öµä×Öµä¿ÉÈÎÒâÌí¼Ó²éѯ×ֶΠ'TwoValue':'0'  
 | 
#        ·µ»ØÖµ£º·ûºÏÌõ¼þµÄÁÐ±í£¬ÁбíÀïÊÇ·ûºÏÌõ¼þµÄÿÐÐ×Öµä  
 | 
#        Ê¹Ó㺠GameRank = FileData()  
 | 
#              list = GameRank.GetRecordByDic({'FrmName':'frmIndividualRankEx','FunctionID':'2'})  
 | 
#              dic = list[0]  
 | 
#              id = dic['FunctionID']  
 | 
  
 | 
#½Ó¿Ú£ºGetRecord£¨fieldName,value£© Í¨¹ý×Ö¶ÎÃûºÍ¸Ã×ֶεÄÖµ²éѯ  
 | 
#        ²ÎÊý£º×Ö¶ÎÃû£¬×Ö¶ÎÖµ  È磺'FrmName','frmIndividualRankEx'  
 | 
#        ·µ»ØÖµ£º·ûºÏÌõ¼þµÄÁÐ±í£¬ÁбíÀïÊÇ·ûºÏÌõ¼þµÄÿÐÐ×Öµä  
 | 
#        Ê¹Ó㺠obj.GetRecord('FrmName','frmIndividualRankEx')[0]['Remark']  
 | 
#  
 | 
#½Ó¿Ú£ºGetRecordCount£¨£© È¡µÃÓÐЧÄÚÈÝÌõÊý  
 | 
#        ·µ»ØÖµ£ºint ÄÚÈÝÌõÊý  
 | 
#  
 | 
#½Ó¿Ú£ºGetRecordByIndex£¨index£© Í¨¹ýË÷Òý·µ»ØÄÚÈÝ  
 | 
#        ²ÎÊý£ºint Ë÷Òý  
 | 
#        ·µ»ØÖµ£º¸ÃË÷ÒýÐеÄ×Öµä  
 | 
#        Ê¹Ó㺠obj.GetRecordByIndex(0)['Remark']  
 |