Skip to content

Instantly share code, notes, and snippets.

@malisetti
Last active May 31, 2018 08:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save malisetti/2c9e6727aa7c03f3f1f73b95991ac4c1 to your computer and use it in GitHub Desktop.
Save malisetti/2c9e6727aa7c03f3f1f73b95991ac4c1 to your computer and use it in GitHub Desktop.
converts csv to json
package main
import (
"bufio"
"encoding/json"
"fmt"
"io"
"os"
"strings"
)
func main() {
out, err := os.Create("out.json")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer func() {
err := out.Close()
if err != nil {
fmt.Printf("%v", err)
}
}()
writer := bufio.NewWriter(out)
defer func() {
err := writer.Flush()
if err != nil {
fmt.Printf("%v", err)
}
}()
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println(err)
os.Exit(1)
}
line = strings.TrimRight(line, "\n")
headers := strings.Split(line, ",")
record := make(map[string]interface{})
hl := len(headers)
writer.WriteString("[")
defer func() {
writer.WriteString("]\n")
}()
recNum := 0
for {
line, err := reader.ReadString('\n')
line = strings.TrimRight(line, "\n")
if err != nil {
if err == io.EOF {
break
} else {
fmt.Println(err)
os.Exit(1)
}
}
vals := strings.Split(line, ",")
for i, v := range vals {
if i > hl-1 {
continue
}
record[headers[i]] = v
}
r, err := json.Marshal(record)
if err != nil {
fmt.Printf("%v\n", err)
continue
}
if recNum%2 != 0 {
writer.WriteString(",\n")
}
_, err = writer.Write(r)
if err != nil {
fmt.Printf("%v\n", err)
}
recNum++
if recNum == 2 {
recNum = 0
}
}
}
// func inferTypes(rows []string) []reflect.Kind {
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment