peaq.tasks/peaq_tasks.go

152 lines
3.5 KiB
Go
Raw Normal View History

2025-02-23 18:11:05 +01:00
package main
import (
"encoding/csv"
2025-02-23 18:59:57 +01:00
"fmt"
2025-02-23 18:11:05 +01:00
"log"
"os"
"path/filepath"
2025-02-23 18:59:57 +01:00
"strconv"
2025-02-23 19:19:48 +01:00
"strings"
2025-02-23 18:59:57 +01:00
"github.com/xuri/excelize/v2"
2025-02-23 18:11:05 +01:00
)
type User struct {
2025-02-23 18:59:57 +01:00
EVM string `json:"evm"`
Email string `json:"email"`
2025-02-23 19:19:48 +01:00
True int `json:"true"`
False int `json:"false"`
2025-02-23 18:59:57 +01:00
Tasks map[string]string `json:"tasks"`
2025-02-23 18:11:05 +01:00
}
var (
2025-02-23 18:59:57 +01:00
users map[string]*User
lines int
headers map[string]int
2025-02-23 18:11:05 +01:00
)
func main() {
users = make(map[string]*User)
2025-02-23 18:59:57 +01:00
headers = make(map[string]int)
2025-02-23 18:11:05 +01:00
// 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)
2025-02-23 18:59:57 +01:00
for _, h := range records[0][2:] {
if _, ok := headers[h]; !ok {
// New header
headers[h] = len(headers)
}
}
2025-02-23 18:11:05 +01:00
for _, record := range records[1:] {
2025-02-23 18:59:57 +01:00
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]
2025-02-23 19:19:48 +01:00
if strings.ToLower(record[2+i]) == "true" {
u.True += 1
} else if strings.ToLower(record[2+i]) == "false" {
u.False += 1
}
2025-02-23 18:59:57 +01:00
}
} else {
// New user
u := &User{
EVM: record[0],
Email: record[1],
2025-02-23 19:19:48 +01:00
True: 0,
False: 0,
2025-02-23 18:59:57 +01:00
Tasks: make(map[string]string),
}
users[u.EVM+`+`+u.Email] = u
for i, h := range records[0][2:] {
u.Tasks[h] = record[2+i]
2025-02-23 19:19:48 +01:00
if strings.ToLower(record[2+i]) == "true" {
u.True += 1
} else if strings.ToLower(record[2+i]) == "false" {
u.False += 1
}
2025-02-23 18:59:57 +01:00
}
2025-02-23 18:11:05 +01:00
}
}
}
}
2025-02-23 18:59:57 +01:00
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")
2025-02-23 19:19:48 +01:00
f.SetCellValue("Sheet1", "C1", "True")
f.SetCellValue("Sheet1", "D1", "False")
f.SetCellValue("Sheet1", "E1", "Empty")
2025-02-23 18:59:57 +01:00
for k, v := range headers {
2025-02-23 19:19:48 +01:00
i, _ := excelize.ColumnNumberToName(v + 6)
2025-02-23 18:59:57 +01:00
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)
2025-02-23 19:19:48 +01:00
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)
2025-02-23 18:59:57 +01:00
for k, v := range u.Tasks {
2025-02-23 19:19:48 +01:00
i, _ := excelize.ColumnNumberToName(headers[k] + 6)
2025-02-23 18:59:57 +01:00
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")
2025-02-23 18:11:05 +01:00
return
}