Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.64 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io/ioutil"
  6.     "regexp"
  7.     "time"
  8. )
  9.  
  10. // Message Define a message structure
  11. type Message struct {
  12.     Name    string
  13.     Message string
  14.     Time    time.Time
  15. }
  16.  
  17. // Messages Hold a slice for all the messages a user was posting at the log file
  18. type Messages []Message
  19.  
  20. // Chats hold a map for all chats at the log based on users
  21. type Chats map[string]Messages
  22.  
  23. func lineToMessage(line string) (Message, error) {
  24.  
  25.     re := regexp.MustCompile(`^\[([^\]]+)\] ([^:]+): (.*?)$`)
  26.     result := re.FindStringSubmatch(line)
  27.     if len(result) != 4 {
  28.         return Message{}, fmt.Errorf("Invalid line format")
  29.     }
  30.     tm, err := time.Parse("2006-01-02 03:04:05 MST", result[1])
  31.     if err != nil {
  32.         return Message{}, err
  33.     }
  34.     msg := Message{
  35.         Time:    tm,
  36.         Name:    result[2],
  37.         Message: result[3],
  38.     }
  39.     return msg, nil
  40. }
  41.  
  42. func mapChats(lines []string) (chats Chats, err error) {
  43.     chats = make(Chats)
  44.     for _, line := range lines {
  45.         msg, err := lineToMessage(line)
  46.         if err != nil {
  47.             return chats, err
  48.         }
  49.         chats[msg.Name] = append(chats[msg.Name], msg)
  50.     }
  51.  
  52.     return
  53. }
  54.  
  55. func parseFile(path string) (chats Chats, err error) {
  56.     buff, err := ioutil.ReadFile(path)
  57.     if err != nil {
  58.         return chats, err
  59.     }
  60.  
  61.     var lines []string
  62.     line := ""
  63.     for _, ch := range buff {
  64.         if ch == '\n' {
  65.             lines = append(lines, line)
  66.             line = ""
  67.             continue
  68.         }
  69.         line = line + string(ch)
  70.     }
  71.  
  72.     chats, err = mapChats(lines)
  73.  
  74.     return chats, err
  75. }
  76.  
  77. func main() {
  78.     chats, err := parseFile("chat.log")
  79.     if err != nil {
  80.         panic(err)
  81.     }
  82.     for key, value := range chats {
  83.         fmt.Printf("User: %s have #%d lines\n", key, len(value))
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement