diff --git a/internal/dirtoexcel/dirtoexcel.go b/internal/dirtoexcel/dirtoexcel.go index f8d29bf..005a916 100644 --- a/internal/dirtoexcel/dirtoexcel.go +++ b/internal/dirtoexcel/dirtoexcel.go @@ -5,6 +5,7 @@ import ( "math" "os" "regexp" + "sort" "strconv" "strings" "time" @@ -22,7 +23,7 @@ func init() { }.NewHandler(os.Stderr))) } -const re = `^(?P[a-zA-Z0-9-]+)(?:_[a-zA-Z]+)?_(?P\d+\.\d{1,2})` +const re = `^(?P[a-zA-Z0-9-\s]+)(?:_[a-zA-Z0-9]+)?_(?P\d+\.\d{1,2})` type Value struct { Company string @@ -102,6 +103,8 @@ func Create(out, dir string) error { res := r.FindAllStringSubmatch(i.Name(), -1) if res == nil { + log.Error("couldnt find match", "file", i.Name()) + return fmt.Errorf("nothing found") } @@ -136,9 +139,12 @@ func Create(out, dir string) error { m[i.Company] += i.Value } + sm := SortMap(m) + valueLength := 0 - for k, v := range m { + for k, v := range sm { + log.Info("KEY", "key", k, "category", cat) if err := f.SetCellStr(cat, fmt.Sprintf("A%d", valueLength+1), k); err != nil { return fmt.Errorf("failed to set cell: %w", err) } @@ -218,3 +224,21 @@ func createCategoryChart(category string, length int, f *excelize.File) error { return nil } + +func SortMap[V any](m map[string]V) map[string]V { + r := map[string]V{} + + keys := make([]string, 0, len(m)) + + for key := range m { + keys = append(keys, key) + } + + sort.Strings(keys) + + for _, k := range keys { + r[k] = m[k] + } + + return r +} diff --git a/internal/dirtoexcel/dirtoexcel_test.go b/internal/dirtoexcel/dirtoexcel_test.go index dcd2f4e..551d1bc 100644 --- a/internal/dirtoexcel/dirtoexcel_test.go +++ b/internal/dirtoexcel/dirtoexcel_test.go @@ -30,6 +30,7 @@ func TestCreate(t *testing.T) { "aldi_10.98.jpg", "aldi_10.00.jpg", "edeka_10.11.jpg", + "casa espana_20221216_62.19.jpg", }, map[string][]want{ "Food": { @@ -53,6 +54,10 @@ func TestCreate(t *testing.T) { "BMA-ZON", "12.34", }, + { + "CASA ESPANA", + "62.19", + }, }, }, }, @@ -78,11 +83,11 @@ func TestCreate(t *testing.T) { // NOTE: Uncomment this to view excel file. // - // eFile, err := os.ReadFile(outfile) - // is.NoErr(err) - // - // err = os.WriteFile(path.Join("/home/marv/wip/amseltools", "foo.xlsx"), eFile, 0o644) - // is.NoErr(err) + eFile, err := os.ReadFile(outfile) + is.NoErr(err) + + err = os.WriteFile(path.Join("/home/marv/wip/amseltools", "foo.xlsx"), eFile, 0o644) + is.NoErr(err) // Read the excel. f, err := excelize.OpenFile(outfile) @@ -119,3 +124,27 @@ func TestCategoriesInsert(t *testing.T) { is.Equal(dirtoexcel.Categories{"NonFood": []dirtoexcel.Value{{"AMAZON", 11.11}}}, m) } + +func TestSortMap(t *testing.T) { + tables := []struct { + name string + input map[string]int + expected map[string]int + }{ + { + "00", + map[string]int{"FOO": 1, "BAR": 2, "ZONK": 3}, + map[string]int{"BAR": 2, "FOO": 1, "ZONK": 3}, + }, + } + + is := is.New(t) + + for _, tt := range tables { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + is.Equal(dirtoexcel.SortMap(tt.input), tt.expected) + }) + } +}