Ever found yourself working with comma separated value (CSV) data from a file or other source? This format is easy to generate if you’re working with spreadsheet applications like Google Sheets or Microsoft Excel, and RDBMS applications. So how do we load this data and work with it in an application? More specifically an application built with the Go programming language?
We’re going to see how to take a CSV file and load it into a custom data structure to eventually be printed as JSON within the application.
In many programming languages, working with comma separated value data is often painful. Generally there are libraries that need to be loaded and a lot of work needs to be done. In Golang, CSV packages are already available to use through the encoding/csv package.
Let’s take a look at the following CSV data:
Nic,Raboy,San Francisco,CA
Maria,Raboy,Dublin,CA
Steve,,,
The above is simple data to represent a list of people. It can have more rows and columns, but for this example it won’t make a difference. The goal here is to load this list of people and print it out as JSON data.
Let’s take a look at the following Golang code:
package main
import (
"bufio"
"encoding/csv"
"encoding/json"
"fmt"
"io"
"log"
"os"
)
type Person struct {
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
Address *Address `json:"address,omitempty"`
}
type Address struct {
City string `json:"city"`
State string `json:"state"`
}
func main() {
csvFile, _ := os.Open("people.csv")
reader := csv.NewReader(bufio.NewReader(csvFile))
var people []Person
for {
line, error := reader.Read()
if error == io.EOF {
break
} else if error != nil {
log.Fatal(error)
}
people = append(people, Person{
Firstname: line[0],
Lastname: line[1],
Address: &Address{
City: line[2],
State: line[3],
},
})
}
peopleJson, _ := json.Marshal(people)
fmt.Println(string(peopleJson))
}
We can assume the above code exists in a main.go file and the CSV data exists in a people.csv file. Both files should exist at the same location on the computer.
type Person struct {
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
Address *Address `json:"address,omitempty"`
}
type Address struct {
City string `json:"city"`
State string `json:"state"`
}
The people data would best be loaded into the above structures. Each property of the structures have a JSON annotation which will allow for easy printing to JSON after it had been loaded.
After opening the comma separated value file, each line is looped through and each column of each line is appended to a people
slice. The comma separated value columns are a slice, so you can get the total column count if you wanted to.
Loading data from comma separated value files in the Go programming language is not difficult because of the included package. The data loaded can easily be transformed into something more manageable.
The encoding/csv package has a lot of options such as trimming columns that can make your life even easier.
A video version of this tutorial can be found below.