main.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. 抽取结果对比
  3. */
  4. package main
  5. import (
  6. "flag"
  7. "fmt"
  8. "jy/mongodbutil"
  9. "log"
  10. qu "qfw/util"
  11. "github.com/tealeg/xlsx"
  12. "gopkg.in/mgo.v2/bson"
  13. )
  14. var (
  15. SysConfig map[string]interface{}
  16. Premgo *mongodbutil.Pool //上个版本库
  17. Newmgo *mongodbutil.Pool //当前版本库
  18. FieldData map[string]map[string]*Data
  19. Compares map[string]*Compare
  20. Sid, Eid string
  21. Fields []string
  22. )
  23. type Compare struct {
  24. Field string //属性
  25. PreExtNum, NewExtNum int //上个版、当前版有值数量
  26. PreNilnum, NewNilnum int //上个版、当前版无值数量
  27. EqNum, NEqNum int //相等、不等数据量
  28. }
  29. type Data struct {
  30. Id string
  31. PreVal, NewVal string
  32. }
  33. func init() {
  34. flag.StringVar(&Sid, "sid", "5d348c0ca5cb26b9b76a4bb8", "开始id")
  35. flag.StringVar(&Eid, "eid", "5d34ae22a5cb26b9b7850b43", "结束id")
  36. flag.Parse()
  37. qu.ReadConfig(&SysConfig)
  38. Premgo = mongodbutil.MgoFactory(1, 3, 120, qu.ObjToString(SysConfig["premgo"]), qu.ObjToString(SysConfig["predb"]))
  39. Newmgo = mongodbutil.MgoFactory(1, 3, 120, qu.ObjToString(SysConfig["newmgo"]), qu.ObjToString(SysConfig["newdb"]))
  40. tmp, _ := SysConfig["fields"].([]interface{})
  41. for _, v := range tmp {
  42. Fields = append(Fields, qu.ObjToString(v))
  43. }
  44. FieldData = map[string]map[string]*Data{}
  45. Compares = map[string]*Compare{}
  46. }
  47. func main() {
  48. getVersionData()
  49. createXlsx()
  50. }
  51. func createXlsx() {
  52. xf, err := xlsx.OpenFile("template.xlsx")
  53. if err != nil {
  54. log.Println(err)
  55. return
  56. }
  57. //生成第一个sheet信息
  58. sh := xf.Sheets[0]
  59. for i, field := range Fields {
  60. for k, row := range sh.Rows {
  61. if k > 2+i {
  62. style := (*row).Cells[1].GetStyle()
  63. style.Font.Color = "000000"
  64. (*row).Cells[0].SetString(field)
  65. (*row).Cells[1].SetInt(Compares[field].PreExtNum)
  66. (*row).Cells[1].SetStyle(style)
  67. (*row).Cells[2].SetInt(Compares[field].NewExtNum)
  68. (*row).Cells[2].SetStyle(style)
  69. (*row).Cells[3].SetInt(Compares[field].EqNum)
  70. (*row).Cells[3].SetStyle(style)
  71. (*row).Cells[4].SetInt(Compares[field].NEqNum)
  72. (*row).Cells[4].SetStyle(style)
  73. }
  74. sh.Rows[k] = row
  75. }
  76. }
  77. //生成信息sheet
  78. url := "https://www.jianyu360.com/article/content/%s.html"
  79. for _, field := range Fields {
  80. sh, _ := xf.AddSheet(field)
  81. rowh := sh.AddRow()
  82. rowh.AddCell().SetString("id")
  83. rowh.AddCell().SetString("preval")
  84. rowh.AddCell().SetString("newval")
  85. rowh.AddCell().SetString("url")
  86. tmp := FieldData[field]
  87. for k, v := range tmp {
  88. if v.NewVal != v.PreVal {
  89. row := sh.AddRow()
  90. row.AddCell().SetString(k)
  91. row.AddCell().SetString(v.PreVal)
  92. row.AddCell().SetString(v.NewVal)
  93. row.AddCell().SetString(fmt.Sprintf(url, qu.CommonEncodeArticle("content", v.Id)))
  94. }
  95. }
  96. }
  97. err = xf.Save("result.xlsx")
  98. if err != nil {
  99. log.Println("保存xlsx失败:", err)
  100. return
  101. }
  102. log.Println("xlsx保存成功")
  103. }
  104. func getVersionData() {
  105. query := bson.M{"_id": bson.M{"$gte": bson.ObjectIdHex(Sid), "$lte": bson.ObjectIdHex(Eid)}}
  106. log.Println(qu.ObjToString(SysConfig["prec"]), query)
  107. list1, _ := Premgo.Find(qu.ObjToString(SysConfig["prec"]), query, nil, `{}`, false, -1, -1)
  108. for _, v := range *list1 {
  109. for _, key := range Fields {
  110. rd := FieldData[key]
  111. if rd == nil {
  112. rd = map[string]*Data{}
  113. }
  114. rd[qu.BsonIdToSId(v["_id"])] = &Data{
  115. Id: qu.BsonIdToSId(v["_id"]),
  116. PreVal: fmt.Sprint(v[key]),
  117. }
  118. FieldData[key] = rd
  119. }
  120. }
  121. log.Println("pre version 加载完成", len(*list1))
  122. list2, _ := Newmgo.Find(qu.ObjToString(SysConfig["newc"]), query, nil, `{}`, false, -1, -1)
  123. for _, v := range *list2 {
  124. for _, field := range Fields {
  125. rd := FieldData[field]
  126. if rd == nil {
  127. rd = map[string]*Data{}
  128. }
  129. _id := qu.BsonIdToSId(v["_id"])
  130. tmp := rd[_id]
  131. if tmp != nil {
  132. tmp.NewVal = fmt.Sprint(v[field])
  133. rd[_id] = tmp
  134. } else {
  135. rd[_id] = &Data{
  136. NewVal: fmt.Sprint(v[field]),
  137. }
  138. }
  139. FieldData[field] = rd
  140. }
  141. }
  142. log.Println("new version 加载完成", len(*list2))
  143. for k, v := range FieldData {
  144. cp := &Compare{Field: k}
  145. for _, d := range v {
  146. if d.NewVal != "" && d.PreVal != "" {
  147. if d.NewVal == d.PreVal {
  148. cp.EqNum++
  149. } else {
  150. cp.NEqNum++
  151. }
  152. cp.PreExtNum++
  153. cp.NewExtNum++
  154. } else {
  155. if d.NewVal == "" {
  156. cp.NewNilnum++
  157. if d.PreVal != "" {
  158. cp.NEqNum++
  159. cp.PreExtNum++
  160. }
  161. }
  162. if d.PreVal == "" {
  163. cp.PreNilnum++
  164. if d.NewVal != "" {
  165. cp.NewExtNum++
  166. cp.NEqNum++
  167. }
  168. }
  169. }
  170. }
  171. Compares[k] = cp
  172. }
  173. }