package main import ( "bufio" "errors" "io" "strconv" "strings" "time" ) type logLine struct { Verb string Args []string Text string } func parseFile(reader io.Reader) []logLine { bufReader := bufio.NewReader(reader) results := make([]logLine, 0, 512) for { line, err := bufReader.ReadString('\n') if err == io.EOF { if len(line) < 2 { break } } else if err != nil { break } if len(line) <= 2 { continue } line = strings.Replace(line, "\n", "", 1) line = strings.Replace(line, "\r", "", 1) results = append(results, parseLine(line)) } return results } func parseLine(line string) logLine { textSplit := strings.SplitN(line, " :", 2) tokens := strings.Split(textSplit[0], " ") ll := logLine{ Verb: tokens[0], } if len(tokens) > 1 { ll.Args = tokens[1:] } if len(textSplit) > 1 { ll.Text = textSplit[1] } return ll } func parseFilename(fname string) (date time.Time, channel string, err error) { date, err = time.ParseInLocation("2006-01-02_150405", fname[:17], time.Local) if err != nil { return } ms, err := strconv.Atoi(fname[17:20]) if err != nil { return } date = date.Add(time.Duration(ms) * time.Millisecond) if len(fname) < 23 { err = errors.New("filename too short") return } channel = fname[21:] return }