92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
// Copyright © 2018 Inanc Gumus
|
|
// Learn Go Programming Course
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
//
|
|
// For more tutorials : https://learngoprogramming.com
|
|
// In-person training : https://www.linkedin.com/in/inancgumus/
|
|
// Follow me on twitter: https://twitter.com/inancgumus
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
const fieldsLength = 4
|
|
|
|
// result stores the parsed result for a domain
|
|
type result struct {
|
|
domain string
|
|
page string
|
|
visits int
|
|
uniques int
|
|
}
|
|
|
|
// add adds the metrics of another result
|
|
func (r result) add(other result) result {
|
|
r.visits += other.visits
|
|
r.uniques += other.uniques
|
|
return r
|
|
}
|
|
|
|
// parseFields parses and returns the parsing result
|
|
func parseFields(line string) (r result, err error) {
|
|
fields := strings.Fields(line)
|
|
|
|
if len(fields) != fieldsLength {
|
|
return r, fmt.Errorf("wrong number of fields %q", fields)
|
|
}
|
|
|
|
r.domain = fields[0]
|
|
r.page = fields[1]
|
|
|
|
f := new(field)
|
|
r.visits = f.uatoi("visits", fields[2])
|
|
r.uniques = f.uatoi("uniques", fields[3])
|
|
|
|
return r, f.err
|
|
}
|
|
|
|
func fastParseFields(data []byte) (res result, err error) {
|
|
const separator = ' '
|
|
|
|
var findex int
|
|
|
|
for i, j := 0, 0; i < len(data); i++ {
|
|
c := data[i]
|
|
last := len(data) == i+1
|
|
|
|
if c != separator && !last {
|
|
continue
|
|
}
|
|
|
|
if last {
|
|
i = len(data)
|
|
}
|
|
|
|
switch fval := data[j:i]; findex {
|
|
case 0:
|
|
res.domain = string(fval)
|
|
case 1:
|
|
res.page = string(fval)
|
|
case 2:
|
|
res.visits, err = atoi(fval)
|
|
case 3:
|
|
res.uniques, err = atoi(fval)
|
|
}
|
|
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
|
|
j = i + 1
|
|
findex++
|
|
}
|
|
|
|
if findex != fieldsLength {
|
|
err = fmt.Errorf("wrong number of fields %q", data)
|
|
}
|
|
return res, err
|
|
}
|