package main import ( "bufio" "fmt" "os" "regexp" "strconv" ) // (2022-07-08 16:54:15.587099) can0 100 [8] 00 00 00 00 00 00 64 00 const expr = "\\((.*)\\)\\s+can\\d+\\s+(\\d+)\\s+\\[\\d\\]\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)" const length = 11 var pattern = regexp.MustCompile(expr) func Readfile(filename *string) <-chan *CanFrame { c := make(chan *CanFrame) go func() { defer close(c) file, err := os.Open(*filename) if err != nil { fmt.Println(err) return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { text := scanner.Text() c <- fromString(&text) } if err := scanner.Err(); err != nil { fmt.Println(err) } }() return c } func fromString(text *string) *CanFrame { submatch := pattern.FindStringSubmatch(*text) if len(submatch) == length { canid, err := strconv.ParseUint(submatch[2], 16, 0) if err != nil { return nil } payload := make([]uint8, 8) for idx, octet := range submatch[3:] { val, err := strconv.ParseUint(octet, 16, 0) if err != nil { fmt.Println(err) continue } payload[idx] = uint8(val) } return &CanFrame{ date: submatch[1], canid: uint32(canid), payload: payload, } } return nil }