createFile.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package cfile
  2. import (
  3. "context"
  4. "encoding/csv"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. "os"
  8. "path"
  9. )
  10. var (
  11. headers = []string{
  12. "bid",
  13. "area",
  14. "city",
  15. "projectId",
  16. "title",
  17. "topType",
  18. "detail",
  19. "publishTime",
  20. "href",
  21. "jyHref",
  22. "projectName",
  23. "projectCode",
  24. "projectScope",
  25. "budget",
  26. "bidAmount",
  27. "buyer",
  28. "buyerCreditNo",
  29. "buyerPerson",
  30. "buyerTel",
  31. "agency",
  32. "agencyPerson",
  33. "agencyTel",
  34. "bidOpenTime",
  35. "bidEndTime",
  36. "topScopeClass",
  37. "winner",
  38. "winnerPerson",
  39. "winnerTel",
  40. "winnersCreditNo",
  41. "winnersEntPerson",
  42. "winnersEntTel",
  43. "winnersEntMail",
  44. }
  45. mapping = map[string]string{
  46. "topScopeClass": "s_topscopeclass",
  47. "winner": "s_winner",
  48. "winnerTel": "winnertel",
  49. "winnerPerson": "winnerperson",
  50. "bidEndTime": "bidendtime",
  51. "bidOpenTime": "bidopentime",
  52. "agencyTel": "agencytel",
  53. "agencyPerson": "agencyperson",
  54. "buyerTel": "buyertel",
  55. "buyerPerson": "buyerperson",
  56. "bidAmount": "bidamount",
  57. "publishTime": "publishtime",
  58. "topType": "toptype",
  59. }
  60. )
  61. func CreateFile(ctx context.Context, data []g.Map, out string) error {
  62. dir := path.Dir(out)
  63. if err := os.Mkdir(dir, 0755); err != nil {
  64. if !os.IsExist(err) {
  65. return err
  66. }
  67. }
  68. //生成文件
  69. file, err := os.Create(out)
  70. if err != nil {
  71. g.Log().Error(ctx, err)
  72. return err
  73. }
  74. defer file.Close()
  75. // 创建CSV写入器
  76. writer := csv.NewWriter(file)
  77. defer writer.Flush()
  78. // 写入标题行
  79. if err := writer.Write(headers); err != nil {
  80. g.Log().Errorf(ctx, "Failed to write headers: %v", err)
  81. }
  82. // 写入数据行
  83. c := splitData(data)
  84. for _, record := range c {
  85. if err := writer.Write(record); err != nil {
  86. g.Log().Errorf(ctx, "Failed to write record: %v", err)
  87. }
  88. }
  89. return nil
  90. }
  91. func splitData(arr []g.Map) (r [][]string) {
  92. for _, m := range arr {
  93. var t []string
  94. for _, filed := range headers {
  95. c, ok := mapping[filed]
  96. if ok && c != "" {
  97. filed = c
  98. }
  99. t = append(t, gconv.String(m[filed]))
  100. }
  101. r = append(r, t)
  102. }
  103. return r
  104. }