odl_ad_tv_record_distribution.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. """备案、发行表数据处理
  4. """
  5. import datetime
  6. import re
  7. import sys
  8. import time
  9. from fty_util.common import Mysql
  10. reload(sys)
  11. sys.setdefaultencoding('utf8')
  12. def parse_date(field, date_format):
  13. """
  14. 日期转换
  15. """
  16. time_format = datetime.datetime.strptime(field, date_format)
  17. time_format = time_format.strftime(u'%Y-%m-%d')
  18. return time_format
  19. def parse_field(field):
  20. """
  21. 处理字段,除了p_detail字段
  22. """
  23. if field is None or len(field) == 0:
  24. return ""
  25. else:
  26. field = strQ2B(field)
  27. return field.replace(' ', '')
  28. def strQ2B(ustring):
  29. """
  30. 全角转半角
  31. """
  32. tstring = ""
  33. for uchar in ustring:
  34. inside_code = ord(uchar)
  35. # 全角空格直接转换
  36. if inside_code == 12288:
  37. inside_code = 32
  38. if inside_code == 160:
  39. inside_code = 32
  40. # 全角字符(除空格)根据关系转化
  41. elif (inside_code >= 65281 and inside_code <= 65374):
  42. inside_code -= 65248
  43. tstring += unichr(inside_code)
  44. return tstring
  45. """
  46. 从 odl.dsj_gongshi(电视剧备案数据)和odl.faxing(电视剧发行数据)表中提取数据到odl.ad_tv_record_distribution表中,作为数据分析来源数据
  47. """
  48. conn = Mysql.createOfflineConn()
  49. # 备案、发行表
  50. sql = """
  51. select id, name, area, theme, company, commit_company, show_date, license_id, form, num, film_date, film_period, `desc`, \
  52. province_advice, relative_depart_advice, remark, scrapy_url, scrapy_date, scrapy_title, p_detail, scrapy_detail_url, \
  53. union_company, scriptwriter, director from odl.dsj_gongshi order by id asc
  54. """
  55. rows = Mysql.getAll(sql, conn=conn)
  56. # conn_max = dev_mysql_conn.Mysql()
  57. sql_max = """
  58. select max(tv_id) tv_id from odl.ad_tv_record_distribution
  59. """
  60. row_max = Mysql.getOne(sql_max, conn=conn)
  61. max_id = 0
  62. if row_max is not None and len(row_max) > 0:
  63. max_id = row_max[0]
  64. for row in rows:
  65. _id = row['id']
  66. if _id <= max_id:
  67. continue
  68. # 将p_detail字段转换为commit_company、show_date、license_id三个字段
  69. p_detail = parse_field(row['p_detail'])
  70. commit_company = ''
  71. show_date = ''
  72. license_id = ''
  73. # 如果p_detail字段为空,则直接处理
  74. if p_detail is None or len(p_detail) == 0:
  75. commit_company = parse_field(row['commit_company'])
  76. show_date = parse_field(row['show_date'])
  77. show_date = show_date.replace(u'年', '-').replace(u'月', '-')
  78. show_date = parse_date(show_date, u'%Y-%m-')
  79. license_id = parse_field(row['license_id'])
  80. else:
  81. try:
  82. str = p_detail.decode('utf8')
  83. xx=ur"\d+[\u5e74]\d+[\u6708]"
  84. p = re.compile(xx)
  85. date = p.findall(str)[0]
  86. company_license = str.split(date)
  87. commit_company = company_license[0]
  88. show_date = date
  89. show_date = parse_date(show_date, '%Y年%m月')
  90. license_id = company_license[-1]
  91. except Exception, e:
  92. pass
  93. # 原始格式 2016.11
  94. film_date = parse_field(row['film_date'])
  95. try:
  96. film_date_pattern = re.compile('\d+')
  97. year_month = film_date_pattern.findall(film_date)
  98. year = year_month[0]
  99. month = year_month[1]
  100. film_date = parse_date(str(year) + '.' + str(month), '%Y.%m')
  101. except Exception, e:
  102. film_date = ''
  103. # film_date = parse_date(film_date, '%Y.%m')
  104. film_period = parse_field(row['film_period'])
  105. name = parse_field(row['name'])
  106. area = parse_field(row['area'])
  107. theme = parse_field(row['theme'])
  108. company = parse_field(row['company'])
  109. if company is None or len(company) == 0:
  110. company = commit_company
  111. form = parse_field(row['form'])
  112. num = parse_field(row['num'])
  113. desc = parse_field(row['desc'])
  114. province_advice = parse_field(row['province_advice'])
  115. relative_depart_advice = parse_field(row['relative_depart_advice'])
  116. remark = parse_field(row['remark'])
  117. scrapy_url = parse_field(row['scrapy_url'])
  118. scrapy_date = row['scrapy_date']
  119. scrapy_title = parse_field(row['scrapy_title'])
  120. scrapy_detail_url = parse_field(row['scrapy_detail_url'])
  121. union_company = parse_field(row['union_company'])
  122. scriptwriter = parse_field(row['scriptwriter'])
  123. director = parse_field(row['director'])
  124. # 变更后的名称
  125. current_name = ''
  126. # 变更后的公司
  127. current_company = ''
  128. # 变更后的集数
  129. current_num = 0
  130. # conn_change_type1 = dev_mysql_conn.Mysql()
  131. # 电视剧名称变更
  132. sql_change_type1 = """
  133. select original_name, current_name from odl.dsj_change where original_name = '%s' and change_type = 1
  134. """
  135. sql_change_type1 = sql_change_type1 % (name)
  136. sql_change_type1_rows = Mysql.getAll(sql_change_type1, conn=conn)
  137. if len(sql_change_type1_rows) == 1:
  138. current_name = sql_change_type1_rows[0]['current_name']
  139. elif len(sql_change_type1_rows) > 1:
  140. # 如果多余一条记录,则存放在dict中
  141. name_dict = {}
  142. for row in sql_change_type1_rows:
  143. original_name = row['original_name']
  144. current_name = row['current_name']
  145. name_dict[original_name] = current_name
  146. while True:
  147. if len(name_dict) > 1:
  148. current_name = name_dict.get(name)
  149. if current_name is None or len(current_name) == 0:
  150. current_name = ''
  151. break
  152. del name_dict[name]
  153. else:
  154. current_name = name_dict.get(current_name)
  155. break
  156. # conn_change_type2 = dev_mysql_conn.Mysql()
  157. # 类型2变更
  158. sql_change_type2 = """
  159. select name, original_company, current_company from odl.dsj_change where name = '%s' and change_type = 2
  160. """
  161. sql_change_type2 = sql_change_type2 % (name)
  162. sql_change_type2_rows = Mysql.getAll(sql_change_type2, conn=conn)
  163. if len(sql_change_type2_rows) == 1:
  164. current_company = sql_change_type2_rows[0]['current_company']
  165. elif len(sql_change_type2_rows) > 1:
  166. company_dict = {}
  167. for row in sql_change_type2_rows:
  168. original_company = row['original_company']
  169. current_company = row['current_company']
  170. company_dict[original_company] = current_company
  171. while True:
  172. if len(company_dict) > 1:
  173. current_company = company_dict.get(company)
  174. if current_company is None or len(current_company) == 0:
  175. current_company = ''
  176. break
  177. del company_dict[company]
  178. else:
  179. current_company = company_dict.get(current_company)
  180. break
  181. # conn_change_type3 = dev_mysql_conn.Mysql()
  182. # 类型3变更
  183. sql_change_type3 = """
  184. select name, original_num, current_num from odl.dsj_change where name = '%s' and change_type = 3
  185. """
  186. sql_change_type3 = sql_change_type3 % (name)
  187. sql_change_type3_rows = Mysql.getAll(sql_change_type3, conn=conn)
  188. if len(sql_change_type3_rows) == 1:
  189. current_num = sql_change_type3_rows[0]['current_num']
  190. elif len(sql_change_type3_rows) > 1:
  191. num_dict = {}
  192. for row in sql_change_type3_rows:
  193. original_num = row['original_num']
  194. current_num = row['current_num']
  195. num_dict[original_num] = current_num
  196. while True:
  197. if len(num_dict) > 1:
  198. current_num = num_dict.get(num)
  199. if current_num is None or len(current_num) == 0:
  200. current_num = 0
  201. break
  202. del num_dict[num]
  203. else:
  204. current_num = num_dict.get(current_num)
  205. break
  206. if current_name is None or len(current_name) == 0:
  207. current_name = name
  208. # 发行数据查询
  209. sql_distribution = """
  210. select name, company, num, pub_date from odl.faxing where name = '%s'
  211. """
  212. sql_distribution = sql_distribution % (current_name)
  213. try:
  214. # conn_distribution = dev_mysql_conn.Mysql()
  215. sql_distribution_rows = Mysql.getAll(sql_distribution, conn=conn)
  216. except Exception, e:
  217. # conn_distribution = dev_mysql_conn.Mysql()
  218. sql_distribution_rows = Mysql.getAll(sql_distribution, conn=conn)
  219. is_distribute = 0
  220. pub_date = ''
  221. if len(sql_distribution_rows) >= 1:
  222. pub_date = sql_distribution_rows[0]['pub_date']
  223. is_distribute = 1
  224. sql_insert = """
  225. insert into odl.ad_tv_record_distribution (tv_id, name, current_name, area, theme, first_type, second_type, company, record_date, form, num, \
  226. film_date, film_period, `desc`, scriptwriter, director, distribution_date, is_distribute) values ('%s', '%s', '%s', '%s', '%s', \
  227. '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')
  228. """
  229. sql_insert = sql_insert % (_id, name, current_name, area, theme, theme, theme, company, show_date, form, num, film_date, film_period, desc.replace("'", "\\'"),
  230. scriptwriter, director, pub_date, is_distribute)
  231. print sql_insert
  232. try_times = 0
  233. while True:
  234. if try_times > 3:
  235. break
  236. try:
  237. # conn1 = dev_mysql_conn.Mysql()
  238. Mysql.insertOne(sql_insert, conn=conn)
  239. try_times = 0
  240. break
  241. except Exception, e:
  242. try_times += 1
  243. print e
  244. if try_times > 3:
  245. break
  246. Mysql.close(conn)