config_cmd.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #coding=utf-8
  2. import sys,os,re,chardet,getopt,csv
  3. repattern = re.compile(r'.*[\.]{1}([^\.]+)')
  4. savepath = './'
  5. def data2UTF8(data):
  6. if data == None or len(data) <=0:
  7. return data
  8. charset = chardet.detect(data)
  9. try:
  10. if charset != None and charset['encoding'] and charset['encoding'] in ('utf-8'):
  11. data = data.decode('utf-8', 'replace').encode('GB2312')
  12. except BaseException:
  13. print(charst)
  14. finally:
  15. return data
  16. def saveFile(filename, data):
  17. file = open(filename, 'w', encoding='utf-8')
  18. if file:
  19. #data = data2UTF8(data)
  20. file.write(data)
  21. file.close()
  22. def convertName(name):
  23. up = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890'
  24. tempname = ''
  25. if len(name) > 0:
  26. tempname = name[0].upper()
  27. for i in range(1,len(name)):
  28. if name[i] not in up:
  29. continue
  30. tempname += name[i]
  31. return tempname
  32. def analysisCsv(filename, csvConfig, defConfig, loadConfig, csvNameListConfig):
  33. namestr = os.path.split(filename)
  34. if len(namestr) < 2:
  35. print('err')
  36. return
  37. stname = os.path.splitext(namestr[1])[0]
  38. convertname = convertName(stname)
  39. #print('name:', name)
  40. outText = '\n\nvar ' + convertname + 'Loader map[int32]*' + convertname
  41. defText = ''
  42. csvNameText = ''
  43. firstAttrName = '' #第一个字段名称
  44. with open(filename, 'r', encoding='utf-8') as myfile:
  45. outText += '\ntype ' + convertname + ' struct{'
  46. lines = csv.reader(myfile)
  47. descList = []
  48. typeList = []
  49. nameList = []
  50. index = 0
  51. for line in lines:
  52. if index == 0:
  53. for i in range(0, len(line)):
  54. descList.append(line[i].strip())
  55. elif index == 1:
  56. for i in range(0, len(line)):
  57. nameList.append(line[i].strip())
  58. elif index == 2:
  59. for i in range(0, len(line)):
  60. if line[i] == 'float':
  61. typeList.append('float32')
  62. elif line[i] == 'int':
  63. typeList.append('int32')
  64. elif line[i] == 'list':
  65. typeList.append('[]string')
  66. else:
  67. typeList.append(line[i].strip())
  68. else:
  69. break
  70. index += 1
  71. #描述
  72. if len(descList) != len(typeList) or len(descList) != len(nameList):
  73. print('err:',stname)
  74. return
  75. for i in range(0,len(descList)):
  76. _desc = descList[i]
  77. _type = typeList[i]
  78. _name = nameList[i]
  79. outText += '\n\t' + convertName(_name) + '\t' + _type + '\t`csv:"' + _name + '"`\t\t//' + _desc
  80. if firstAttrName == '':
  81. firstAttrName = convertName(_name)
  82. outText += '\n}'
  83. outText += '\nfunc ' + convertname + 'Load(path string) {\n\tcfg := []*' + convertname + '{}\n'
  84. outText += '\t' + convertname + 'Loader = map[int32]*' + convertname + '{}\n'
  85. outText += '\tloadCsvCfg(path + "' + stname + '.csv", &cfg)\n\tfor _,row := range cfg{\n\t\t'
  86. outText += convertname + 'Loader[row.' + firstAttrName + '] = row\n\t}\n}'
  87. defText = '\n\tCFG_' + convertname + ' = "' + stname + '.csv"'
  88. csvNameText = '\n\tCFGNameList["' + stname + '"] = ' + stname + 'Load'
  89. loadConfig.append('\n\t'+convertname+"Load(path)")
  90. print('file done:',filename)
  91. csvConfig.append(outText)
  92. defConfig.append(defText)
  93. csvNameListConfig.append(csvNameText)
  94. #saveFile(savepath + stname+'.go', outText)
  95. def analysisXml(filename, defConfig):
  96. print('xml:',filename)
  97. namestr = os.path.split(filename)
  98. if len(namestr) < 2:
  99. print('err')
  100. return
  101. stname = os.path.splitext(namestr[1])[0]
  102. convertname = convertName(stname)
  103. defText = '\n\t"' + stname + '",'
  104. defConfig.append(defText)
  105. #获取路径下的指定类型文件列表
  106. def getFileList(path, fileList):
  107. for parent, dirnames, filenames in os.walk(path):
  108. for filename in filenames:
  109. match = repattern.match(filename)
  110. if match:
  111. filetype = match.groups()[0]
  112. if filetype in ['csv']:
  113. fileList.append(os.path.join(parent, filename))
  114. if filetype in ['xml']:
  115. fileList.append(os.path.join(parent, filename))
  116. if __name__ == '__main__':
  117. configFile = ''#'D:/rowok/cehua/'
  118. try:
  119. opts,args = getopt.getopt(sys.argv[1:], "hp:d:", ["help","dir="])
  120. for opt, arg in opts:
  121. if opt in ("-d", "--dir"):
  122. configFile = arg
  123. except getopt.GetoptError:
  124. useage()
  125. sys.exit(1)
  126. csvConfigFile = configFile + '/csv'
  127. xmlConfigFile = configFile + '/xml'
  128. #解析csv文件获得服务器使用的结构体
  129. fileList = []
  130. csvConfig = []
  131. defConfig = []
  132. csvNameListConfig = []
  133. loadConfig = []
  134. xmlConfigFileList = []
  135. defXmlConfig = []
  136. getFileList(csvConfigFile, fileList)
  137. getFileList(xmlConfigFile, xmlConfigFileList)
  138. for file in fileList:
  139. analysisCsv(file, csvConfig, defConfig, loadConfig, csvNameListConfig)
  140. for file in xmlConfigFileList:
  141. analysisXml(file, defXmlConfig)
  142. file = open(savepath+'config_csv.go', 'w', encoding='utf-8')
  143. if file:
  144. file.write('package serverproto\n\n')
  145. file.write('const (')
  146. for out in defConfig:
  147. file.write(out)
  148. file.write('\n)\n')
  149. file.write('var CFGNameList = map[string]func(path string){}')
  150. file.write('\n\nfunc configNameListInit(){')
  151. for out in csvNameListConfig:
  152. file.write(out)
  153. file.write('\n}')
  154. file.write('\n\n\nvar XmlFileList = []string{')
  155. for out in defXmlConfig:
  156. file.write(out)
  157. file.write('\n}\n\n')
  158. file.write('//load config data\nfunc ConfigInit(path string) {')
  159. file.write('\n\tconfigNameListInit()')
  160. for out in loadConfig:
  161. file.write(out)
  162. file.write('\n}')
  163. for out in csvConfig:
  164. file.write(out)
  165. file.close()