go-csv-to-json/csv.go

70 lines
1.3 KiB
Go

package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"io"
"log"
"os"
)
func main() {
if 3 != len(os.Args) {
fmt.Println("Usage: go run csv.go file.csv")
os.Exit(1)
}
rpath := os.Args[1]
wpath := os.Args[2]
f, err := os.Open(rpath)
if nil != err {
log.Fatal("open csv file for reading:", err)
}
fw, err := os.OpenFile(wpath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0750)
if nil != err {
log.Fatal("open json file for writing:", err)
}
b := []byte("[\n")
r := csv.NewReader(f)
for {
row, err := r.Read()
if nil != err {
if io.EOF == err {
_, err = fw.Write([]byte("\n]\n"))
break
}
// deceptive: the one error embeds another error
if err, ok := err.(*csv.ParseError); !ok || err.Err != csv.ErrFieldCount {
log.Fatal("error while parsing csv:", err)
}
}
fmt.Println(len(row))
// write previous byte ("[", or ","{
_, err = fw.Write(b)
if nil != err {
log.Fatal("file write", err)
}
// string array to json
b, err = json.Marshal(row)
if nil != err {
log.Fatal("marshal row to json", err)
}
// write string array
_, err = fw.Write(b)
if nil != err {
log.Fatal("file write", err)
}
// assign next byte
b = []byte(",\n")
}
err = fw.Close()
if nil != err {
log.Fatal("close json file:", err)
}
}