| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #coding=utf-8
- import sys,os,re,chardet,getopt,csv
- repattern = re.compile(r'.*[\.]{1}([^\.]+)')
- savepath = './'
- def data2UTF8(data):
- if data == None or len(data) <=0:
- return data
- charset = chardet.detect(data)
- try:
- if charset != None and charset['encoding'] and charset['encoding'] in ('utf-8'):
- data = data.decode('utf-8', 'replace').encode('GB2312')
- except BaseException:
- print(charst)
- finally:
- return data
- def saveFile(filename, data):
- file = open(filename, 'w', encoding='utf-8')
- if file:
- #data = data2UTF8(data)
- file.write(data)
- file.close()
- def convertName(name):
- up = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890'
- tempname = ''
- if len(name) > 0:
- tempname = name[0].upper()
- for i in range(1,len(name)):
- if name[i] not in up:
- continue
- tempname += name[i]
- return tempname
- def analysisCsv(filename, csvConfig, defConfig, loadConfig, csvNameListConfig):
- namestr = os.path.split(filename)
- if len(namestr) < 2:
- print('err')
- return
- stname = os.path.splitext(namestr[1])[0]
- convertname = convertName(stname)
- #print('name:', name)
- outText = '\n\nvar ' + convertname + 'Loader map[int32]*' + convertname
- defText = ''
- csvNameText = ''
- firstAttrName = '' #第一个字段名称
- with open(filename, 'r', encoding='utf-8') as myfile:
- outText += '\ntype ' + convertname + ' struct{'
- lines = csv.reader(myfile)
- descList = []
- typeList = []
- nameList = []
- index = 0
- for line in lines:
- if index == 0:
- for i in range(0, len(line)):
- descList.append(line[i].strip())
- elif index == 1:
- for i in range(0, len(line)):
- nameList.append(line[i].strip())
- elif index == 2:
- for i in range(0, len(line)):
- if line[i] == 'float':
- typeList.append('float32')
- elif line[i] == 'int':
- typeList.append('int32')
- elif line[i] == 'list':
- typeList.append('[]string')
- else:
- typeList.append(line[i].strip())
- else:
- break
- index += 1
- #描述
- if len(descList) != len(typeList) or len(descList) != len(nameList):
- print('err:',stname)
- return
- for i in range(0,len(descList)):
- _desc = descList[i]
- _type = typeList[i]
- _name = nameList[i]
- outText += '\n\t' + convertName(_name) + '\t' + _type + '\t`csv:"' + _name + '"`\t\t//' + _desc
- if firstAttrName == '':
- firstAttrName = convertName(_name)
- outText += '\n}'
- outText += '\nfunc ' + convertname + 'Load(path string) {\n\tcfg := []*' + convertname + '{}\n'
- outText += '\t' + convertname + 'Loader = map[int32]*' + convertname + '{}\n'
- outText += '\tloadCsvCfg(path + "' + stname + '.csv", &cfg)\n\tfor _,row := range cfg{\n\t\t'
- outText += convertname + 'Loader[row.' + firstAttrName + '] = row\n\t}\n}'
- defText = '\n\tCFG_' + convertname + ' = "' + stname + '.csv"'
- csvNameText = '\n\tCFGNameList["' + stname + '"] = ' + stname + 'Load'
- loadConfig.append('\n\t'+convertname+"Load(path)")
- print('file done:',filename)
- csvConfig.append(outText)
- defConfig.append(defText)
- csvNameListConfig.append(csvNameText)
-
- #saveFile(savepath + stname+'.go', outText)
- def analysisXml(filename, defConfig):
- print('xml:',filename)
- namestr = os.path.split(filename)
- if len(namestr) < 2:
- print('err')
- return
- stname = os.path.splitext(namestr[1])[0]
- convertname = convertName(stname)
- defText = '\n\t"' + stname + '",'
- defConfig.append(defText)
- #获取路径下的指定类型文件列表
- def getFileList(path, fileList):
- for parent, dirnames, filenames in os.walk(path):
- for filename in filenames:
- match = repattern.match(filename)
- if match:
- filetype = match.groups()[0]
- if filetype in ['csv']:
- fileList.append(os.path.join(parent, filename))
- if filetype in ['xml']:
- fileList.append(os.path.join(parent, filename))
- if __name__ == '__main__':
- configFile = ''#'D:/rowok/cehua/'
- try:
- opts,args = getopt.getopt(sys.argv[1:], "hp:d:", ["help","dir="])
- for opt, arg in opts:
- if opt in ("-d", "--dir"):
- configFile = arg
- except getopt.GetoptError:
- useage()
- sys.exit(1)
- csvConfigFile = configFile + '/csv'
- xmlConfigFile = configFile + '/xml'
- #解析csv文件获得服务器使用的结构体
- fileList = []
- csvConfig = []
- defConfig = []
- csvNameListConfig = []
- loadConfig = []
- xmlConfigFileList = []
- defXmlConfig = []
- getFileList(csvConfigFile, fileList)
- getFileList(xmlConfigFile, xmlConfigFileList)
- for file in fileList:
- analysisCsv(file, csvConfig, defConfig, loadConfig, csvNameListConfig)
- for file in xmlConfigFileList:
- analysisXml(file, defXmlConfig)
- file = open(savepath+'config_csv.go', 'w', encoding='utf-8')
- if file:
- file.write('package serverproto\n\n')
- file.write('const (')
- for out in defConfig:
- file.write(out)
- file.write('\n)\n')
- file.write('var CFGNameList = map[string]func(path string){}')
- file.write('\n\nfunc configNameListInit(){')
- for out in csvNameListConfig:
- file.write(out)
- file.write('\n}')
- file.write('\n\n\nvar XmlFileList = []string{')
- for out in defXmlConfig:
- file.write(out)
- file.write('\n}\n\n')
- file.write('//load config data\nfunc ConfigInit(path string) {')
- file.write('\n\tconfigNameListInit()')
- for out in loadConfig:
- file.write(out)
- file.write('\n}')
- for out in csvConfig:
- file.write(out)
- file.close()
|