extractcity_new.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package extract
  2. import (
  3. . "jy/pretreated"
  4. ju "jy/util"
  5. qu "qfw/util"
  6. "strings"
  7. )
  8. // 标准化校验后存值
  9. func (e *ExtractTask) ExtractRegionClean(tmp *map[string]interface{}) {
  10. //标准化校验
  11. update_check := make(map[string]interface{}, 0)
  12. e.GetCheckFinallyRegionInfo(*tmp, &update_check)
  13. for k, v := range update_check {
  14. if k == "area" || k == "city" || k == "district" {
  15. (*tmp)[k] = v
  16. }
  17. if k == "modifycheck" && v != nil {
  18. (*tmp)[k] = v
  19. }
  20. }
  21. }
  22. // 抽取地域信息
  23. func (e *ExtractTask) ExtractRegionInfo(j *ju.Job, tmp *map[string]interface{}, isLog bool) {
  24. defer qu.Catch()
  25. //日志记录
  26. logRecordInfo := []map[string]interface{}{}
  27. f_area, f_city, f_district := "", "", ""
  28. all_regions := map[string]map[string]map[string]string{}
  29. //jsondata ~ 前置条件
  30. e.GetRegionByTentativeJsonData(j, &all_regions)
  31. if isLog && len(all_regions) > 0 {
  32. valueArr := []string{}
  33. valueArr = append(valueArr, qu.ObjToString((*j.Jsondata)["area_city_district"]))
  34. LogProcessRecordingForTentative("jsondata", valueArr, all_regions, &logRecordInfo)
  35. }
  36. b := ConfirmUniqueRegionInfo(all_regions, &f_area, &f_city, &f_district)
  37. if b {
  38. CompleteRegionInfo(&f_area, &f_city, &f_district)
  39. //最终赋值
  40. (*tmp)["area"] = f_area
  41. (*tmp)["city"] = f_city
  42. (*tmp)["district"] = f_district
  43. (*tmp)["regions_log"] = logRecordInfo
  44. return
  45. }
  46. //是否三大运营商-前置条件2
  47. e.GetRegionByTentativeOperator(qu.ObjToString((*tmp)["winner"]), &all_regions)
  48. if isLog && len(all_regions) > 0 {
  49. valueArr := []string{}
  50. valueArr = append(valueArr, qu.ObjToString((*tmp)["winner"]))
  51. LogProcessRecordingForTentative("运营商", valueArr, all_regions, &logRecordInfo)
  52. }
  53. b = ConfirmUniqueRegionInfo(all_regions, &f_area, &f_city, &f_district)
  54. if b {
  55. CompleteRegionInfo(&f_area, &f_city, &f_district)
  56. //最终赋值
  57. (*tmp)["area"] = f_area
  58. (*tmp)["city"] = f_city
  59. (*tmp)["district"] = f_district
  60. (*tmp)["regions_log"] = logRecordInfo
  61. return
  62. }
  63. //字段可控
  64. RegionFieldsArr := ju.DefaultRegions
  65. //采购单位比较特殊~需要根据站点类型进行重新组合
  66. if e.IsConsecutionRegion(qu.ObjToString((*tmp)["site"])) {
  67. RegionFieldsArr = ju.AdjustmentRegions
  68. }
  69. for _, v := range RegionFieldsArr {
  70. keyArr := strings.Split(v, ",")
  71. isExists, textValues, field_regions, old_regions, new_regions := e.GetRegionByGroupInfo(keyArr, *tmp)
  72. if isExists { //是否存在抽取有效值
  73. AnalysisIsUniqueInfo(new_regions, &all_regions)
  74. if isLog { //日志记录
  75. LogProcessRecordingForGroupInfo(strings.Join(keyArr, "_"), textValues, field_regions, old_regions, all_regions, &logRecordInfo)
  76. }
  77. b = ConfirmUniqueRegionInfo(all_regions, &f_area, &f_city, &f_district)
  78. if b {
  79. CompleteRegionInfo(&f_area, &f_city, &f_district)
  80. //最终赋值
  81. (*tmp)["area"] = f_area
  82. (*tmp)["city"] = f_city
  83. (*tmp)["district"] = f_district
  84. (*tmp)["regions_log"] = logRecordInfo
  85. return
  86. }
  87. }
  88. }
  89. //未提前结束~筛选出~最终的
  90. ConfirmUniqueRegionInfo(all_regions, &f_area, &f_city, &f_district)
  91. //給地域做建议的清洗完善
  92. CompleteRegionInfo(&f_area, &f_city, &f_district)
  93. //用到的字段
  94. projectname := qu.ObjToString((*tmp)["projectname"])
  95. buyer := qu.ObjToString((*tmp)["buyer"])
  96. site := qu.ObjToString((*tmp)["site"])
  97. //新疆兵团补充地域~
  98. if XjbtReg.MatchString(buyer) && f_city == "" {
  99. if a, c, d, ok := e.NewVerifyXjCorpsInfo(buyer); ok {
  100. f_area, f_city, f_district = a, c, d
  101. if isLog {
  102. LogProcessRecordingForSupplement(&logRecordInfo, map[string]interface{}{
  103. "sup_xjbt": f_area + "~" + f_city + "~" + f_district,
  104. })
  105. }
  106. }
  107. }
  108. //此时进行特殊链路新增、补充原则
  109. if f_city == "" {
  110. e.LinkSpecialRuleFullStep(projectname, &f_area, &f_city, &f_district)
  111. }
  112. //企业补充城市校验逻辑
  113. if buyer != "" && f_city == "" && (f_area == "全国" || f_area == "") {
  114. LinkSpecialQyxyStep(buyer, &f_area, &f_city, &f_district)
  115. if f_area != "" && f_area != "全国" && isLog {
  116. LogProcessRecordingForSupplement(&logRecordInfo, map[string]interface{}{
  117. "sup_qy_link": f_area + "~" + f_city + "~" + f_district,
  118. })
  119. }
  120. }
  121. if f_city == "" {
  122. e.LinkSpecialRuleBriefStep(projectname, &f_area, &f_city, &f_district)
  123. }
  124. if f_city == "" {
  125. e.LinkSpecialRuleBriefStep(buyer, &f_area, &f_city, &f_district)
  126. }
  127. if isLog {
  128. LogProcessRecordingForSupplement(&logRecordInfo, map[string]interface{}{
  129. "sup_link": f_area + "~" + f_city + "~" + f_district,
  130. })
  131. }
  132. //正文补充地域~
  133. if f_area == "全国" || f_area == "" || f_city == "" {
  134. if b := e.NewVerifySensitiveInfo(qu.ObjToString((*j.Data)["detail"]), &f_area, &f_city, &f_district); b {
  135. if isLog {
  136. LogProcessRecordingForSupplement(&logRecordInfo, map[string]interface{}{
  137. "sup_detail": f_area + "~" + f_city + "~" + f_district,
  138. })
  139. }
  140. }
  141. }
  142. //最终站点补充
  143. if f_area == "全国" || f_area == "" {
  144. if sc := e.SiteCityMap[site]; sc != nil && sc.Q != "" {
  145. f_area = sc.Q
  146. if isLog {
  147. LogProcessRecordingForSupplement(&logRecordInfo, map[string]interface{}{
  148. "sup_site": f_area + "~" + f_city + "~" + f_district,
  149. })
  150. }
  151. }
  152. }
  153. //最终在清洗一遍数据
  154. CompleteRegionInfo(&f_area, &f_city, &f_district)
  155. //最终赋值
  156. (*tmp)["area"] = f_area
  157. (*tmp)["city"] = f_city
  158. (*tmp)["district"] = f_district
  159. (*tmp)["regions_log"] = logRecordInfo
  160. }
  161. // 对组进行分析处理
  162. func (e *ExtractTask) GetRegionByGroupInfo(keyArr []string, tmp map[string]interface{}) (bool, []string, map[string]interface{}, map[string]map[string]map[string]string, map[string]map[string]map[string]string) {
  163. old_regions := map[string]map[string]map[string]string{}
  164. isExists := false
  165. textArr := []string{}
  166. field_regions := map[string]interface{}{}
  167. for _, key := range keyArr {
  168. text := ""
  169. if key == "site_area" || key == "site_city" {
  170. text = qu.ObjToString(tmp["site"])
  171. } else if key == "buyer_filiale" {
  172. text = GetFilialeByBuyerInfo(qu.ObjToString(tmp["buyer"]))
  173. } else if key == "projectname" {
  174. text = CleanRegionProjectNameInfo(qu.ObjToString(tmp[key]), qu.ObjToString(tmp["buyer"]))
  175. } else {
  176. text = qu.ObjToString(tmp[key])
  177. }
  178. textArr = append(textArr, text)
  179. if text != "" {
  180. isExists = true
  181. } else {
  182. continue //无值不用提取
  183. }
  184. valuesArr := []map[string]interface{}{}
  185. if key == "buyerzipcode" {
  186. valuesArr = e.GetRegionByPostCode(text, &old_regions)
  187. } else if key == "buyertel" {
  188. valuesArr = e.GetRegionByTelNumber(text, &old_regions)
  189. } else if key == "site_area" {
  190. valuesArr = e.GetRegionBySite(text, &old_regions, 1)
  191. } else if key == "site_city" {
  192. valuesArr = e.GetRegionBySite(text, &old_regions, 2)
  193. } else if key == "buyer_filiale" {
  194. valuesArr = e.GetRegionFromText(text, &old_regions, false, false, 2)
  195. } else {
  196. isAddress, isBrief := false, false
  197. if key == "projectaddr" || key == "addressing" || key == "bidopenaddress" || key == "buyeraddr" {
  198. isAddress = true
  199. }
  200. valuesArr = e.GetRegionFromText(text, &old_regions, isAddress, isBrief, 2)
  201. }
  202. field_regions[key] = valuesArr
  203. }
  204. //校验当前组的合理性
  205. new_regions := ReasonableGroupRegionInfo(old_regions)
  206. return isExists, textArr, field_regions, old_regions, new_regions
  207. }
  208. // 邮政编号
  209. func (e *ExtractTask) GetRegionByPostCode(text string, regions *map[string]map[string]map[string]string) []map[string]interface{} {
  210. regionsArr := []map[string]interface{}{}
  211. pc := e.PostCodeMap[text]
  212. if pc != nil {
  213. if len(pc.D) == 1 {
  214. UpdateRegionsInfo(pc.P, pc.C, pc.D[0], regions)
  215. regionsArr = append(regionsArr, map[string]interface{}{"area": pc.P, "city": pc.C, "district": pc.D[0]})
  216. } else {
  217. UpdateRegionsInfo(pc.P, pc.C, "", regions)
  218. regionsArr = append(regionsArr, map[string]interface{}{"area": pc.P, "city": pc.C, "district": ""})
  219. }
  220. }
  221. return regionsArr
  222. }
  223. // 固话号码
  224. func (e *ExtractTask) GetRegionByTelNumber(text string, regions *map[string]map[string]map[string]string) []map[string]interface{} {
  225. regionsArr := []map[string]interface{}{}
  226. if len(text) >= 11 {
  227. if strings.HasPrefix(text, "0") { //区号除了澳门853其他都是以0开头
  228. n := 4
  229. L:
  230. areacode := text[:n]
  231. ac := e.AreaCodeMap[areacode]
  232. if ac != nil {
  233. if len(ac.C) == 1 {
  234. UpdateRegionsInfo(ac.P, ac.C[0], "", regions)
  235. regionsArr = append(regionsArr, map[string]interface{}{"area": ac.P, "city": ac.C[0], "district": ""})
  236. } else {
  237. UpdateRegionsInfo(ac.P, "", "", regions)
  238. regionsArr = append(regionsArr, map[string]interface{}{"area": ac.P, "city": "", "district": ""})
  239. }
  240. } else {
  241. n = n - 1
  242. if n >= 3 {
  243. goto L
  244. }
  245. }
  246. }
  247. }
  248. return regionsArr
  249. }
  250. // 初步确认~采集
  251. func (e *ExtractTask) GetRegionByTentativeJsonData(j *ju.Job, all_regions *map[string]map[string]map[string]string) {
  252. area, city, district := "", "", ""
  253. regions := map[string]map[string]map[string]string{}
  254. if j.Jsondata != nil {
  255. jsondata := *j.Jsondata
  256. if a_c_d, ok := jsondata["area_city_district"].(string); ok && a_c_d != "" {
  257. e.GetRegionFromText(a_c_d, &regions, false, false, 1)
  258. }
  259. }
  260. if len(regions) == 1 {
  261. for k, v := range regions {
  262. area = k
  263. if len(v) == 1 {
  264. for k1, v1 := range v {
  265. city = k1
  266. if len(v1) == 1 {
  267. for k2, _ := range v1 {
  268. district = k2
  269. }
  270. } else {
  271. break
  272. }
  273. }
  274. } else {
  275. break
  276. }
  277. }
  278. }
  279. if area != "" { //组装结构
  280. city_info := map[string]map[string]string{}
  281. district_info := map[string]string{}
  282. if city != "" {
  283. if district != "" {
  284. district_info[district] = district
  285. }
  286. city_info[city] = district_info
  287. }
  288. (*all_regions)[area] = city_info
  289. }
  290. }
  291. // 简称全程标准化的校验~
  292. func (e *ExtractTask) StandardizedegionInfo(area *string, city *string, district *string) {
  293. //特殊市补充
  294. if *area == "北京" {
  295. *city = "北京市"
  296. } else if *area == "天津" {
  297. *city = "天津市"
  298. } else if *area == "上海" {
  299. *city = "上海市"
  300. } else if *area == "重庆" {
  301. *city = "重庆市"
  302. }
  303. //非空与空~是否标准校验
  304. if *area == "" {
  305. *city = ""
  306. *district = ""
  307. } else {
  308. if province := e.ProvinceMap[*area]; province != "" {
  309. *area = province
  310. }
  311. if *city == "" {
  312. *district = ""
  313. } else {
  314. if csMap := e.CityBriefMap[*city]; csMap != nil {
  315. if csMap.P.Brief == *area && csMap.Name != "" {
  316. *city = csMap.Name
  317. } else {
  318. *city = ""
  319. *district = ""
  320. }
  321. } else {
  322. if e.CityMap[*city] == "" {
  323. *city = ""
  324. *district = ""
  325. }
  326. }
  327. if *district != "" {
  328. citysArr := e.DistrictSimAndAll[*district]
  329. if len(citysArr) == 1 {
  330. full_city := citysArr[0]
  331. for d, _ := range full_city {
  332. *district = d
  333. }
  334. } else if len(citysArr) > 1 {
  335. *district = ""
  336. } else if len(citysArr) == 0 {
  337. fullArr := e.DistrictCityMap[*district]
  338. if len(fullArr) == 0 {
  339. *district = ""
  340. }
  341. } else {
  342. }
  343. }
  344. }
  345. }
  346. }
  347. // 站点取值 from 1-省 2-省市
  348. func (e *ExtractTask) GetRegionBySite(site string, regions *map[string]map[string]map[string]string, from int) []map[string]interface{} {
  349. regionArr := []map[string]interface{}{}
  350. area, city, district := "", "", ""
  351. if scMap := e.SiteCityMap[site]; scMap != nil {
  352. if scMap.P != "" && scMap.P != "全国" && scMap.P != "null" {
  353. area = scMap.P
  354. }
  355. if scMap.C != "" && scMap.C != "null" && area != "" {
  356. city = scMap.C
  357. }
  358. }
  359. e.StandardizedegionInfo(&area, &city, &district)
  360. if from == 1 && area != "" && area != "全国" {
  361. UpdateRegionsInfo(area, "", "", regions)
  362. regionArr = append(regionArr, map[string]interface{}{"area": area, "city": "", "district": ""})
  363. }
  364. if from == 2 && area != "" && area != "全国" && city != "" {
  365. UpdateRegionsInfo(area, city, "", regions)
  366. regionArr = append(regionArr, map[string]interface{}{"area": area, "city": city, "district": ""})
  367. }
  368. return regionArr
  369. }
  370. // 新疆兵团
  371. func (e *ExtractTask) NewVerifyXjCorpsInfo(buyer string) (new_a, new_c, new_d string, ok bool) {
  372. buyer = strings.ReplaceAll(buyer, "新疆兵团", "新疆生产建设兵团")
  373. ok = false
  374. for _, info := range e.XjbtCityArr {
  375. name := qu.ObjToString(info["name"])
  376. alias := qu.ObjToString(info["alias"])
  377. if strings.Contains(buyer, name) || strings.Contains(buyer, alias) {
  378. new_a = qu.ObjToString(info["area"])
  379. new_c = qu.ObjToString(info["city"])
  380. new_d = qu.ObjToString(info["district"])
  381. ok = true
  382. list := ju.IsMarkInterfaceMap(info["list"])
  383. for _, c := range list {
  384. c_name := qu.ObjToString(c["name"])
  385. if strings.Contains(buyer, name+c_name) || strings.Contains(buyer, alias+c_name) {
  386. new_a = qu.ObjToString(c["area"])
  387. new_c = qu.ObjToString(c["city"])
  388. new_d = qu.ObjToString(c["district"])
  389. break
  390. }
  391. }
  392. break
  393. }
  394. }
  395. return new_a, new_c, new_d, ok
  396. }
  397. // 敏感词识别
  398. func (e *ExtractTask) NewVerifySensitiveInfo(detail string, area *string, city *string, district *string) bool {
  399. detail = SensitiveReg.ReplaceAllString(detail, "")
  400. detail = TextAfterRemoveTable(detail)
  401. detail = CleanDetailReg1.ReplaceAllString(detail, "")
  402. //全称城市
  403. fullCityArr := e.SensitiveFullCity.FindAll(detail)
  404. if len(fullCityArr) == 1 {
  405. for _, v := range fullCityArr {
  406. if cityMap := e.CityFullMap[v]; cityMap != nil {
  407. if *area == "" || *area == "全国" || cityMap.P.Brief == *area {
  408. *area = cityMap.P.Brief
  409. *city = cityMap.Name
  410. return true
  411. }
  412. }
  413. }
  414. }
  415. //全称区县
  416. fullDistrictArr := e.SensitiveFullDistrict.FindAll(detail)
  417. if len(fullDistrictArr) == 1 {
  418. for _, v := range fullDistrictArr {
  419. if citys := e.DistrictCityMap[v]; len(citys) == 1 {
  420. if *area == "" || *area == "全国" || citys[0].P.Brief == *area {
  421. *area = citys[0].P.Brief
  422. *city = citys[0].Name
  423. *district = v
  424. return true
  425. }
  426. }
  427. }
  428. }
  429. //简称城市
  430. simCityArr := e.SensitiveSimCity.FindAll(detail)
  431. if len(simCityArr) == 1 {
  432. for _, v := range simCityArr {
  433. if cityMap := e.CityBriefMap[v]; cityMap != nil {
  434. if *area == "" || *area == "全国" {
  435. *area = cityMap.P.Brief
  436. if !strings.Contains(*area, v) {
  437. *city = cityMap.Name
  438. }
  439. return true
  440. }
  441. if cityMap.P.Brief == *area && !strings.Contains(*area, v) {
  442. *area = cityMap.P.Brief
  443. *city = cityMap.Name
  444. return true
  445. }
  446. }
  447. }
  448. }
  449. //疑似固话提取~
  450. if *area == "" || *area == "全国" {
  451. fixedTelArr := FixedTelReg.FindAllString(detail, -1)
  452. if len(fixedTelArr) > 0 {
  453. codeArr := resetFixedTelInfo(fixedTelArr)
  454. if len(codeArr) == 1 {
  455. for _, v := range codeArr {
  456. if ac := e.AreaCodeMap[v]; ac != nil {
  457. *area = ac.P
  458. return true
  459. }
  460. }
  461. }
  462. }
  463. }
  464. return false
  465. }
  466. func resetFixedTelInfo(telArr []string) []string {
  467. codeArr := []string{}
  468. telsMap := map[string]string{}
  469. for _, v := range telArr {
  470. if v != "" {
  471. arr := strings.Split(v, "-")
  472. code := qu.ObjToString(arr[0])
  473. if telsMap[code] == "" {
  474. telsMap[code] = code
  475. codeArr = append(codeArr, code)
  476. }
  477. }
  478. }
  479. return codeArr
  480. }
  481. // 初步确认~运营商
  482. func (e *ExtractTask) GetRegionByTentativeOperator(winner string, all_regions *map[string]map[string]map[string]string) {
  483. area, city, district := "", "", ""
  484. regions := map[string]map[string]map[string]string{}
  485. if OperatorReg.MatchString(winner) {
  486. e.GetRegionFromText(winner, &regions, false, false, 2)
  487. }
  488. if len(regions) == 1 {
  489. for k, v := range regions {
  490. area = k
  491. if len(v) == 1 {
  492. for k1, v1 := range v {
  493. city = k1
  494. if len(v1) == 1 {
  495. for k2, _ := range v1 {
  496. district = k2
  497. }
  498. } else {
  499. break
  500. }
  501. }
  502. } else {
  503. break
  504. }
  505. }
  506. }
  507. if area != "" { //组装结构
  508. //舍弃运营商的数据-area不一致
  509. if (*all_regions)[area] == nil && len((*all_regions)) > 0 {
  510. return
  511. }
  512. city_info := map[string]map[string]string{}
  513. if (*all_regions)[area] != nil {
  514. city_info = (*all_regions)[area]
  515. }
  516. district_info := map[string]string{}
  517. if city != "" {
  518. //舍弃运营商的数据-city不一致
  519. if city_info[city] == nil && len(city_info) > 0 {
  520. return
  521. }
  522. if district != "" {
  523. district_info[district] = district
  524. }
  525. city_info[city] = district_info
  526. }
  527. (*all_regions)[area] = city_info
  528. }
  529. }
  530. //初步确认~站点
  531. //func (e *ExtractTask) GetRegionByTentativeSite(j *ju.Job, all_regions *map[string]map[string]map[string]string) {
  532. // area, city, district := "", "", ""
  533. // site, _ := (*j.Data)["site"].(string)
  534. // if scMap := e.SiteCityMap[site]; scMap != nil {
  535. // if scMap.P != "" && scMap.P != "全国" && scMap.P != "null" {
  536. // area = scMap.P
  537. // }
  538. // if scMap.C != "" && scMap.C != "null" && area != "" {
  539. // city = scMap.C
  540. // }
  541. // //if scMap.D != "" && scMap.D != "null" && city != "" {
  542. // // district = scMap.D
  543. // //}
  544. // }
  545. //
  546. // //对省市区进行标准化校验~简称全程的问题
  547. // e.StandardizedegionInfo(&area, &city, &district)
  548. //
  549. // //取出唯一数据
  550. // j_area, j_city, j_district := "", "", ""
  551. // is_adjust := false
  552. // if len(*all_regions) == 1 { //有值~只进行补充操作
  553. // for k, v := range *all_regions {
  554. // j_area = k
  555. // for k1, v1 := range v {
  556. // j_city = k1
  557. // for k2, _ := range v1 {
  558. // j_district = k2
  559. // }
  560. // }
  561. // }
  562. // if j_area == area && area != "" {
  563. // if city != "" {
  564. // if j_city == "" {
  565. // is_adjust = true
  566. // } else if j_city == city {
  567. // if district != "" && j_district == "" {
  568. // is_adjust = true
  569. // }
  570. // }
  571. // }
  572. // }
  573. // } else {
  574. // is_adjust = true
  575. // }
  576. // if is_adjust && area != "" { //进行调整
  577. // city_info := map[string]map[string]string{}
  578. // district_info := map[string]string{}
  579. // if city != "" {
  580. // if district != "" {
  581. // district_info[district] = district
  582. // }
  583. // city_info[city] = district_info
  584. // }
  585. // (*all_regions)[area] = city_info
  586. // }
  587. //}