mirror of
https://github.com/johnkerl/miller.git
synced 2026-01-23 02:14:13 +00:00
114 lines
2 KiB
Text
114 lines
2 KiB
Text
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// ----------------------------------------------------------------
|
|
func main() {
|
|
args := os.Args[1:]
|
|
includeFields := []string {"a", "x"};
|
|
|
|
ok := true
|
|
if len(args) == 0 {
|
|
ok = handle("-", includeFields) && ok
|
|
} else {
|
|
for _, arg := range args {
|
|
ok = handle(arg, includeFields) && ok
|
|
}
|
|
}
|
|
if ok {
|
|
os.Exit(0)
|
|
} else {
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
func handle(fileName string, includeFields []string) (ok bool) {
|
|
inputStream := os.Stdin
|
|
if fileName != "-" {
|
|
var err error
|
|
if inputStream, err = os.Open(fileName); err != nil {
|
|
log.Println(err)
|
|
return false
|
|
}
|
|
}
|
|
|
|
reader := bufio.NewReader(inputStream)
|
|
writer := bufio.NewWriter(os.Stdout)
|
|
eof := false
|
|
|
|
for !eof {
|
|
line, err := reader.ReadString('\n')
|
|
if err == io.EOF {
|
|
err = nil
|
|
eof = true
|
|
} else if err != nil {
|
|
log.Println(err)
|
|
if fileName != "-" {
|
|
inputStream.Close()
|
|
}
|
|
return false
|
|
} else {
|
|
|
|
// 0.030s
|
|
|
|
// Line to map
|
|
mymap := make(map[string]string)
|
|
fields := strings.Split(line, ",");
|
|
for _, field := range(fields) {
|
|
kvps := strings.SplitN(field, "=", 2)
|
|
mymap[kvps[0]] = kvps[1]
|
|
}
|
|
// 0.220s
|
|
// delta 0.190s
|
|
// 27%
|
|
|
|
// Map-to-map transform
|
|
newmap := make(map[string]string)
|
|
for _, includeField := range(includeFields) {
|
|
value, present := mymap[includeField]
|
|
if present {
|
|
newmap[includeField] = value
|
|
}
|
|
}
|
|
// 0.280s
|
|
// delta 0.060s
|
|
// 9%
|
|
|
|
// Map to string
|
|
outs := make([]string, len(newmap))
|
|
i := 0
|
|
for k, v := range(newmap) {
|
|
outs[i] = k + "=" + v
|
|
i++
|
|
}
|
|
// 0.320s
|
|
// delta 0.040s
|
|
// 6%
|
|
|
|
out := strings.Join(outs, ",")
|
|
// 0.330s
|
|
// delta 0.010s
|
|
// 2%
|
|
|
|
// Write to output stream
|
|
//fmt.Println("")
|
|
writer.WriteString(out)
|
|
// delta 0.390s
|
|
// 56%
|
|
|
|
}
|
|
}
|
|
if fileName != "-" {
|
|
inputStream.Close()
|
|
}
|
|
writer.Flush()
|
|
|
|
return true
|
|
}
|