update for merge all csv
This commit is contained in:
parent
e9c41ae4fd
commit
c044a7440f
13
go.mod
13
go.mod
@ -1,3 +1,16 @@
|
|||||||
module git.siteop.biz/shoopea/peaq.tasks
|
module git.siteop.biz/shoopea/peaq.tasks
|
||||||
|
|
||||||
go 1.23.2
|
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
29
go.sum
Normal 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=
|
@ -2,23 +2,30 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/xuri/excelize/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
EVM string `json:"evm"`
|
EVM string `json:"evm"`
|
||||||
Email string `json:"email"`
|
Email string `json:"email"`
|
||||||
|
Tasks map[string]string `json:"tasks"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
users map[string]*User
|
users map[string]*User
|
||||||
lines int
|
lines int
|
||||||
|
headers map[string]int
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
users = make(map[string]*User)
|
users = make(map[string]*User)
|
||||||
|
headers = make(map[string]int)
|
||||||
// Get the current working directory
|
// Get the current working directory
|
||||||
cwd, err := os.Getwd()
|
cwd, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -50,15 +57,74 @@ func main() {
|
|||||||
log.Printf("Read %d records from %s\n", len(records), file.Name())
|
log.Printf("Read %d records from %s\n", len(records), file.Name())
|
||||||
lines += len(records)
|
lines += len(records)
|
||||||
|
|
||||||
|
for _, h := range records[0][2:] {
|
||||||
|
if _, ok := headers[h]; !ok {
|
||||||
|
// New header
|
||||||
|
headers[h] = len(headers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, record := range records[1:] {
|
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{
|
u := &User{
|
||||||
EVM: record[0],
|
EVM: record[0],
|
||||||
Email: record[1],
|
Email: record[1],
|
||||||
|
Tasks: make(map[string]string),
|
||||||
}
|
}
|
||||||
users[u.EVM+`+`+u.Email] = u
|
users[u.EVM+`+`+u.Email] = u
|
||||||
|
for i, h := range records[0][2:] {
|
||||||
|
u.Tasks[h] = record[2+i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user