Skip to content

Instantly share code, notes, and snippets.

@magicianlib
Last active June 15, 2022 09:40
Show Gist options
  • Save magicianlib/5883e27d5042c490c642aa642f5a3434 to your computer and use it in GitHub Desktop.
Save magicianlib/5883e27d5042c490c642aa642f5a3434 to your computer and use it in GitHub Desktop.
CSV 操作示例
import (
"github.com/gocarina/gocsv"
"os"
"time"
)
type DateTime struct {
time.Time
}
type Member struct {
Id string `csv:"账号"`
Name string `csv:"昵称"`
Age uint8 `csv:"年龄"`
Birthday DateTime `csv:"生日"`
Ignore bool `csv:"-"` // ignore by csv
}
// Implementation gocsv.TypeMarshaller Interface Custom DateTime Output Format
//
func (t *DateTime) MarshalCSV() (string, error) {
f := t.Time.Format("2006-01-02")
return f, nil
}
// Implementation gocsv.TypeUnmarshaller Interface Custom DateTime Input Format
//
func (t *DateTime) UnmarshalCSV(csv string) (err error) {
t.Time, err = time.Parse("2006-01-02", csv)
return
}
func CustomWriter() {
f, err := os.OpenFile("member.csv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
var members []*Member
members = append(members, &Member{
Id: "4BAB0D03-07D4-418B-B0B2-B38EAE4F4743",
Name: "韩梅梅",
Age: 20,
Birthday: DateTime{time.Now()},
Ignore: false,
})
err = gocsv.MarshalFile(&members, f)
if err != nil {
panic(err)
}
// Custom CSV Writer
gocsv.SetCSVWriter(func(w io.Writer) *gocsv.SafeCSVWriter {
nw := csv.NewWriter(w)
nw.Comma = '|' // Custom Separator
return gocsv.NewSafeCSVWriter(nw)
})
err = gocsv.MarshalFile(&members, f)
if err != nil {
panic(err)
}
/*
Output:
账号|昵称|年龄|生日
4BAB0D03-07D4-418B-B0B2-B38EAE4F4743|韩梅梅|20|2022-06-15
*/
}
func CustomReader() {
f, err := os.OpenFile("member.csv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
var members []*Member
// Custom CSV Reader
gocsv.SetCSVReader(func(r io.Reader) gocsv.CSVReader {
nr := csv.NewReader(r)
nr.Comma = '|' // Custom Separator
return nr
})
err = gocsv.Unmarshal(f, &members)
if err != nil {
panic(err)
}
for _, m := range members {
fmt.Println(m)
}
}
import (
"github.com/gocarina/gocsv"
"os"
"time"
)
type DateTime struct {
time.Time
}
type Member struct {
Id string `csv:"账号"`
Name string `csv:"昵称"`
Age uint8 `csv:"年龄"`
Birthday DateTime `csv:"生日"`
Ignore bool `csv:"-"` // Ignore by csv
}
func DefaultWriter() {
f, err := os.OpenFile("member.csv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
var members []*Member
members = append(members, &Member{
Id: "4BAB0D03-07D4-418B-B0B2-B38EAE4F4743",
Name: "韩梅梅",
Age: 20,
Birthday: DateTime{time.Now()},
Ignore: false,
})
err = gocsv.MarshalFile(&members, f)
if err != nil {
panic(err)
}
/*
Output:
账号,昵称,年龄,生日
4BAB0D03-07D4-418B-B0B2-B38EAE4F4743,韩梅梅,20,2022-06-15T15:00:54.20487+08:00
*/
}
func DefaultReader() {
f, err := os.OpenFile("member.csv", os.O_RDWR|os.O_APPEND|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer f.Close()
var members []*Member
err = gocsv.Unmarshal(f, &members)
if err != nil {
panic(err)
}
for _, m := range members {
fmt.Println(m)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment