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  }