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 }