Чтение файла формата CSV в Golang

Чтение файла формата CSV в Golang

Формат CSV довольно популярен среди тех, кто работает с табличными приложениями, такими как Google Sheets или Microsoft Excel. Как работать с этим форматом в приложениях на языке Go? Сегодня мы разберёмся с этой задачей: загрузим CSV в структуру данных, а затем выгрузим данные в JSON.

В других языках программирования работа с данными, разделёнными запятыми (CSV), бывает очень сложной. Бывает, что для этого даже пишут целые библиотеки. В Go работа с данными в формате CSV возможна «из коробки» благодаря пакету encoding/csv.

Возьмём для примера следующий данные (файл people.csv):

Nic,Raboy,San Francisco,CA
Maria,Raboy,Dublin,CA
Steve,,,

Это просто небольшой список людей. Он может содержать много строк и колонок, но для нашего примера этого достаточно.

А теперь перейдём непосредственно к коду программы:

// main.go

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))
}

Перед запуском приложения убедитесь, что оба файла — код в файле main.go и данные в CSV в файле people.csv — существуют и находятся рядом в любой папке вашего компьютера.

Рассмотрим подробнее структуру:

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"`
}

Здесь мы создали поля для каждой колонки файла CSV, а также добавили аннотации для выгрузки в JSON.

Программа работает следующим образом: после открытия файла с данными в цикле проходит каждую строку и загружает её в слайс people типа Person. Колонки в CSV это также слайс, поэтому можно очень легко получить их количество, если нужно.

Источник: «Parse CSV Data Using The Go Programming Language»

Leave a Comment