152 lines
3.5 KiB
Go
152 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/xuri/excelize/v2"
|
|
)
|
|
|
|
type User struct {
|
|
EVM string `json:"evm"`
|
|
Email string `json:"email"`
|
|
True int `json:"true"`
|
|
False int `json:"false"`
|
|
Tasks map[string]string `json:"tasks"`
|
|
}
|
|
|
|
var (
|
|
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 {
|
|
log.Fatalf("failed to get current directory: %w", err)
|
|
}
|
|
|
|
// Read files in the directory
|
|
files, err := os.ReadDir(cwd)
|
|
if err != nil {
|
|
log.Fatalf("failed to read directory: %w", err)
|
|
}
|
|
|
|
// Loop through files and open CSVs
|
|
for _, file := range files {
|
|
if !file.IsDir() && filepath.Ext(file.Name()) == ".csv" {
|
|
log.Printf("Opening: %s\n", file.Name())
|
|
f, err := os.Open(file.Name())
|
|
if err != nil {
|
|
log.Fatalf("failed to open file %s: %w", file.Name(), err)
|
|
}
|
|
defer f.Close()
|
|
|
|
reader := csv.NewReader(f)
|
|
records, err := reader.ReadAll()
|
|
if err != nil {
|
|
log.Fatalf("failed to read CSV %s: %w", file.Name(), err)
|
|
}
|
|
|
|
log.Printf("Read %d records from %s\n", len(records), file.Name())
|
|
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:] {
|
|
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]
|
|
if strings.ToLower(record[2+i]) == "true" {
|
|
u.True += 1
|
|
} else if strings.ToLower(record[2+i]) == "false" {
|
|
u.False += 1
|
|
}
|
|
}
|
|
} else {
|
|
// New user
|
|
u := &User{
|
|
EVM: record[0],
|
|
Email: record[1],
|
|
True: 0,
|
|
False: 0,
|
|
Tasks: make(map[string]string),
|
|
}
|
|
users[u.EVM+`+`+u.Email] = u
|
|
for i, h := range records[0][2:] {
|
|
u.Tasks[h] = record[2+i]
|
|
if strings.ToLower(record[2+i]) == "true" {
|
|
u.True += 1
|
|
} else if strings.ToLower(record[2+i]) == "false" {
|
|
u.False += 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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")
|
|
f.SetCellValue("Sheet1", "C1", "True")
|
|
f.SetCellValue("Sheet1", "D1", "False")
|
|
f.SetCellValue("Sheet1", "E1", "Empty")
|
|
for k, v := range headers {
|
|
i, _ := excelize.ColumnNumberToName(v + 6)
|
|
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)
|
|
f.SetCellValue("Sheet1", `C`+strconv.Itoa(uid), u.True)
|
|
f.SetCellValue("Sheet1", `D`+strconv.Itoa(uid), u.False)
|
|
f.SetCellValue("Sheet1", `E`+strconv.Itoa(uid), len(headers)-u.True-u.False)
|
|
for k, v := range u.Tasks {
|
|
i, _ := excelize.ColumnNumberToName(headers[k] + 6)
|
|
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
|
|
}
|