From c044a7440f5f25076f9fbe26146ddacd4b70f2b1 Mon Sep 17 00:00:00 2001 From: shoopea Date: Sun, 23 Feb 2025 18:59:57 +0100 Subject: [PATCH] update for merge all csv --- go.mod | 13 ++++++++ go.sum | 29 +++++++++++++++++ peaq_tasks.go | 86 +++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index e321489..f1aec05 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,16 @@ module git.siteop.biz/shoopea/peaq.tasks go 1.23.2 + +require github.com/xuri/excelize/v2 v2.9.0 + +require ( + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.4 // indirect + github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect + github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/text v0.19.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..1e32c54 --- /dev/null +++ b/go.sum @@ -0,0 +1,29 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= +github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= +github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE= +github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE= +github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A= +github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/peaq_tasks.go b/peaq_tasks.go index c117c2c..1d9fde9 100644 --- a/peaq_tasks.go +++ b/peaq_tasks.go @@ -2,23 +2,30 @@ package main import ( "encoding/csv" + "fmt" "log" "os" "path/filepath" + "strconv" + + "github.com/xuri/excelize/v2" ) type User struct { - EVM string `json:"evm"` - Email string `json:"email"` + EVM string `json:"evm"` + Email string `json:"email"` + Tasks map[string]string `json:"tasks"` } var ( - users map[string]*User - lines int + users map[string]*User + lines int + headers map[string]int ) func main() { users = make(map[string]*User) + headers = make(map[string]int) // Get the current working directory cwd, err := os.Getwd() if err != nil { @@ -50,15 +57,74 @@ func main() { log.Printf("Read %d records from %s\n", len(records), file.Name()) lines += len(records) - for _, record := range records[1:] { - u := &User{ - EVM: record[0], - Email: record[1], + for _, h := range records[0][2:] { + if _, ok := headers[h]; !ok { + // New header + headers[h] = len(headers) + } + } + + for _, record := range records[1:] { + if u, ok := users[record[0]+`+`+record[1]]; ok { + // User already exists + for i, h := range records[0][2:] { + u.Tasks[h] = record[2+i] + } + } else { + // New user + u := &User{ + EVM: record[0], + Email: record[1], + Tasks: make(map[string]string), + } + users[u.EVM+`+`+u.Email] = u + for i, h := range records[0][2:] { + u.Tasks[h] = record[2+i] + } } - users[u.EVM+`+`+u.Email] = u } } } - log.Printf("Found %d unique records from %d lines", len(users), lines) + log.Printf("Found %d unique records from %d lines\n", len(users), lines) + + // Create a new Excel file + f := excelize.NewFile() + + // Create a new sheet + i, err := f.NewSheet("Sheet1") + if err != nil { + log.Fatalf("failed to create sheet: %w", err) + } + + // Set active sheet + f.SetActiveSheet(i) + + // Fill headers + f.SetCellValue("Sheet1", "A1", "EVM") + f.SetCellValue("Sheet1", "B1", "Email") + for k, v := range headers { + i, _ := excelize.ColumnNumberToName(v + 3) + f.SetCellValue("Sheet1", i+`1`, k) + } + + uid := 2 + for _, u := range users { + f.SetCellValue("Sheet1", `A`+strconv.Itoa(uid), u.EVM) + f.SetCellValue("Sheet1", `B`+strconv.Itoa(uid), u.Email) + for k, v := range u.Tasks { + i, _ := excelize.ColumnNumberToName(headers[k] + 3) + f.SetCellValue("Sheet1", i+strconv.Itoa(uid), v) + } + uid += 1 + } + + // Save the file + err = f.SaveAs("Tasks.xlsx") + if err != nil { + log.Fatalf("failed to read directory: %w", err) + } + + fmt.Printf("Excel file created successfully!\n") + return }