Andrea Fazzi 1b2df6f79a Add gocarina csv 6 жил өмнө
..
.gitignore 1b2df6f79a Add gocarina csv 6 жил өмнө
.travis.yml 1b2df6f79a Add gocarina csv 6 жил өмнө
LICENSE 1b2df6f79a Add gocarina csv 6 жил өмнө
README.md 1b2df6f79a Add gocarina csv 6 жил өмнө
csv.go 1b2df6f79a Add gocarina csv 6 жил өмнө
decode.go 1b2df6f79a Add gocarina csv 6 жил өмнө
encode.go 1b2df6f79a Add gocarina csv 6 жил өмнө
reflect.go 1b2df6f79a Add gocarina csv 6 жил өмнө
safe_csv.go 1b2df6f79a Add gocarina csv 6 жил өмнө
types.go 1b2df6f79a Add gocarina csv 6 жил өмнө

README.md

Go CSV

The GoCSV package aims to provide easy serialization and deserialization functions to use CSV in Golang

API and techniques inspired from https://godoc.org/gopkg.in/mgo.v2

GoDoc Build Status

Installation


Full example
=====

Consider the following CSV file

csv

client_id,client_name,client_age 1,Jose,42 2,Daniel,26 3,Vincent,32


Easy binding in Go!
---

go

package main

import (

"fmt"
"gocsv"
"os"

)

type Client struct { // Our example struct, you can use "-" to ignore a field

Id      string `csv:"client_id"`
Name    string `csv:"client_name"`
Age     string `csv:"client_age"`
NotUsed string `csv:"-"`

}

func main() {

clientsFile, err := os.OpenFile("clients.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
    panic(err)
}
defer clientsFile.Close()

clients := []*Client{}

if err := gocsv.UnmarshalFile(clientsFile, &clients); err != nil { // Load clients from file
    panic(err)
}
for _, client := range clients {
    fmt.Println("Hello", client.Name)
}

if _, err := clientsFile.Seek(0, 0); err != nil { // Go to the start of the file
    panic(err)
}

clients = append(clients, &Client{Id: "12", Name: "John", Age: "21"}) // Add clients
clients = append(clients, &Client{Id: "13", Name: "Fred"})
clients = append(clients, &Client{Id: "14", Name: "James", Age: "32"})
clients = append(clients, &Client{Id: "15", Name: "Danny"})
csvContent, err := gocsv.MarshalString(&clients) // Get all clients as CSV string
//err = gocsv.MarshalFile(&clients, clientsFile) // Use this to save the CSV back to the file
if err != nil {
    panic(err)
}
fmt.Println(csvContent) // Display all clients as CSV string

}


Customizable Converters
---

go

type DateTime struct {

time.Time

}

// Convert the internal date as CSV string func (date *DateTime) MarshalCSV() (string, error) {

return date.Time.Format("20060201"), nil

}

// You could also use the standard Stringer interface func (date *DateTime) String() (string) {

return date.String() // Redundant, just for example

}

// Convert the CSV string as internal date func (date *DateTime) UnmarshalCSV(csv string) (err error) {

date.Time, err = time.Parse("20060201", csv)
if err != nil {
    return err
}
return nil

}

type Client struct { // Our example struct with a custom type (DateTime)

Id       string   `csv:"id"`
Name     string   `csv:"name"`
Employed DateTime `csv:"employed"`

}


Customizable CSV Reader / Writer
---

go

func main() {

    ...

    gocsv.SetCSVReader(func(in io.Reader) gocsv.CSVReader {
        r := csv.NewReader(in)
        r.Comma = '|'
        return r // Allows use pipe as delimiter
    })  

    ...

    gocsv.SetCSVReader(func(in io.Reader) gocsv.CSVReader {
        r := csv.NewReader(in)
        r.LazyQuotes = true
        r.Comma = '.'
        return r // Allows use dot as delimiter and use quotes in CSV
    })

    ...

    gocsv.SetCSVReader(func(in io.Reader) gocsv.CSVReader {
        //return csv.NewReader(in)
        return gocsv.LazyCSVReader(in) // Allows use of quotes in CSV
    })

    ...

    gocsv.UnmarshalFile(file, &clients)

    ...

    gocsv.SetCSVWriter(func(out io.Writer) *SafeCSVWriter {
        writer := csv.NewWriter(out)
        writer.Comma = '|'
        return gocsv.NewSafeCSVWriter(writer)
    })

    ...

    gocsv.MarshalFile(&clients, file)

    ...

}

```