diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 18:15:14 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-11-07 18:15:14 -0500 |
| commit | 688972df9daa1f80d24feff5c056ab3a66c4eee9 (patch) | |
| tree | 057f1a8379cc11e747d88ee409b1db6d598f2cd6 /sw/cal/csv.go | |
| parent | 29da72a76d5e043a181f66e8758c4d511c3ef814 (diff) | |
| download | can-gauge-interface-688972df9daa1f80d24feff5c056ab3a66c4eee9.zip | |
cal: parse csv tables
Diffstat (limited to 'sw/cal/csv.go')
| -rw-r--r-- | sw/cal/csv.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sw/cal/csv.go b/sw/cal/csv.go new file mode 100644 index 0000000..bb5cd01 --- /dev/null +++ b/sw/cal/csv.go @@ -0,0 +1,55 @@ +package main + +import ( + "os" + "fmt" + "io" + "strconv" + "encoding/csv" +) + +func parseTable(filename string) (map[int32]uint16, error) { + f, err := os.Open(filename) + if err != nil { + eprintf("%v\n", err) + } + defer f.Close() + + tbl := make(map[int32]uint16) + rdr := csv.NewReader(f) + for { + err := parseRow(rdr, tbl) + if err == io.EOF { + return tbl, nil + } else if err != nil { + return nil, fmt.Errorf("%s:%v", filename, err) + } + } +} + +func parseRow(rdr *csv.Reader, tbl map[int32]uint16) error { + row, err := rdr.Read() + if err != nil { + return err + } + if len(row) != 2 { + line, _ := rdr.FieldPos(0) + return fmt.Errorf("%d: malformed row", line) + } + key, err := strconv.ParseInt(row[0], 10, 32) + if err != nil { + line, col := rdr.FieldPos(0) + return fmt.Errorf("%d:%d: %v", line, col, err) + } + val, err := strconv.ParseUint(row[1], 10, 16) + if err != nil { + line, col := rdr.FieldPos(1) + return fmt.Errorf("%d:%d: %v", line, col, err) + } + if _, ok := tbl[int32(key)]; ok { + line, col := rdr.FieldPos(0) + return fmt.Errorf("%d: %d: duplicate key %d", line, col, key) + } + tbl[int32(key)] = uint16(val) + return nil +} |