github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/test/others/func/import/words.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/easysoft/zendata/cmd/test/others/func/comm" 8 "github.com/easysoft/zendata/cmd/test/others/func/model" 9 10 "gorm.io/gorm" 11 ) 12 13 func main() { 14 filePathArr := []string{ 15 "./data/words/v1/互联网黑话.xlsx", 16 "./data/words/v1/介词词库.xlsx", 17 "./data/words/v1/代词词库.xlsx", 18 "./data/words/v1/副词词库.xlsx", 19 "./data/words/v1/动词词库.xlsx", 20 "./data/words/v1/助词词库.xlsx", 21 "./data/words/v1/名词词库.xlsx", 22 "./data/words/v1/形容词做谓语.xlsx", 23 "./data/words/v1/形容词词库.xlsx", 24 "./data/words/v1/数词词库.xlsx", 25 "./data/words/v1/连词词库.xlsx", 26 "./data/words/v1/量词词库.xlsx", 27 } 28 29 db := comm.GetDB() 30 if err := db.AutoMigrate( 31 &model.DataWordTagGroup{}, &model.DataWordTag{}, &model.DataWord{}, 32 ); err != nil { 33 panic(err) 34 } 35 36 logs := []string{} 37 for i, path := range filePathArr { 38 sheetName, count := ImportWordsFromExcel(path, db) 39 str := fmt.Sprintf("%d) Path:[%s] SheetName:[%s], count:[%d]\n", i, path, sheetName, count) 40 fmt.Print(str) 41 logs = append(logs, str) 42 } 43 44 for _, l := range logs { 45 fmt.Print(l) 46 } 47 } 48 49 func ImportWordsFromExcel(filePath string, db *gorm.DB) (sheetName string, count int) { 50 sheetName, rows := comm.GetExcelFirstSheet(filePath) 51 fmt.Printf("importing ... : [%s] \n", sheetName) 52 53 if len(rows) == 0 { 54 return 55 } 56 57 headers := rows[0] 58 if len(headers) < 1 { 59 return 60 } 61 62 headers = headers[1:] 63 64 // create word-tag-group 65 group := model.DataWordTagGroup{Name: strings.TrimSpace(sheetName)} 66 if err := db.Save(&group).Error; err != nil { 67 fmt.Errorf("creating word-tag-group : \n%v\n", err) 68 return 69 } 70 71 // create word-tags 72 tags := make([]model.DataWordTag, 0, len(headers)) 73 for _, v := range headers { 74 tag := model.DataWordTag{Name: strings.TrimSpace(v)} 75 76 ret := db.First(&tag, "name = ?", strings.TrimSpace(v)) 77 if ret.RowsAffected == 0 { 78 tag.Groups = []*model.DataWordTagGroup{&group} 79 if err := db.Save(&tag).Error; err != nil { 80 fmt.Errorf("sheetName:[%s], Tag[%s]", sheetName, v) 81 return 82 } 83 } else { 84 if err := db.Model(&tag).Association("Groups").Append(&group); err != nil { 85 fmt.Errorf("sheetName:[%s], Tag[%s]", sheetName, v) 86 return 87 } 88 } 89 90 tags = append(tags, tag) 91 } 92 93 // create word 94 95 words := make([]model.DataWord, 0, len(rows)) 96 97 for i, r := range rows[1:] { 98 if len(r) == 0 { 99 fmt.Printf("shettName:[%s}, row index:[%d]", sheetName, i+1) 100 continue 101 } 102 103 word := model.DataWord{ 104 Word: strings.TrimSpace(r[0]), 105 TagGroupId: group.Id, 106 } 107 108 flag := false 109 for j, v := range r[1:] { 110 if strings.TrimSpace(v) != "" { 111 word.Tags = []*model.DataWordTag{&tags[j]} 112 flag = true 113 break 114 } 115 } 116 117 if !flag { 118 fmt.Errorf("word (%v) is not tag.", word) 119 } 120 121 words = append(words, word) 122 } 123 124 tx := db.CreateInBatches(&words, 1000) 125 if tx.Error != nil { 126 fmt.Errorf("%v", tx.Error) 127 } 128 129 var count64 int64 130 tx.Count(&count64) 131 count = int(count64) 132 133 return 134 }