update for merge all csv

This commit is contained in:
shoopea 2025-02-23 18:59:57 +01:00
parent e9c41ae4fd
commit c044a7440f
3 changed files with 118 additions and 10 deletions

13
go.mod
View File

@ -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
)

29
go.sum Normal file
View File

@ -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=

View File

@ -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
}