csv

package module
v0.0.0-...-b468b89 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2025 License: MIT Imports: 10 Imported by: 0

README

csv

使用结构体读写 csv 文件

使用
type QTime time.Time

func (q QTime) MarshalCSV() (string, error) {
	return (time.Time)(q).Format("2006/1/2 15:04"), nil
}

func (q *QTime) UnmarshalCSV(s string) error {
	t, err := time.Parse("2006/1/2 15:04", s)
	if err != nil {
		return err
	}
	*q = QTime(t)
	return nil
}

func (q QTime) String() string {
	return time.Time(q).Format("2006/01/02 15:04")
}

var _ csv.Marshaler = (*QTime)(nil)
var _ csv.Unmarshaler = (*QTime)(nil)

type Tags []string

func (t Tags) MarshalCSV() (string, error) {
	if len(t) == 0 {
		return "", nil
	} else if len(t) == 1 {
		return t[0], nil
	}
	return "#" + strings.Join(t, "#"), nil
}

func (t *Tags) UnmarshalCSV(s string) error {
	for _, v := range strings.Split(s, "#") {
		if v != "" {
			*t = append(*t, v)
		}
	}
	return nil
}

func (t Tags) String() string {
	return strings.Join(t, "/")
}

var _ csv.Marshaler = (*Tags)(nil)
var _ csv.Unmarshaler = (*Tags)(nil)

type Test struct {
	A1  *QTime `csv:"时间"`
	A2  string `csv:"分类"`
	A3  string `csv:"类型"`
	A4  []byte `csv:"金额"`
	A5  string `csv:"账户1"`
	A6  string `csv:"账户2"`
	A7  string `csv:"备注"`
	B1  int
	A8  string `csv:"账单标记"`
	A9  string `csv:"手续费"`
	A10 string `csv:"优惠券"`
	A11 *Tags  `csv:"标签"`
	A12 string `csv:"账单图片"`
}

func (Test) OrderedCSV() []string {
	return []string{"时间", "类型", "金额", "备注", "标签"}
}

var _ csv.Ordered = (*Test)(nil)

var data = []byte(`时间,分类,类型,金额,账户1,账户2,备注,账单标记,手续费,优惠券,标签,账单图片
2022/7/12 21:20,三餐,支出,28.58,微信,,去肯德基吃汉堡(此行数据是示例,可以删除),不计收支,,,种草,http://billimg.qianjiapp.com/202006300908267611e24759b6c1c8781361af861!webporigin
2022/7/8 22:15,工资,收入,1000,,,7月份工资(此行数据是示例,可以删除),,,,#老婆#旅行,
2022/7/8 10:10,,转账,200,支付宝,招商银行卡,支付宝提现1000元到银行卡(此行数据是示例,可以删除),,,,#冲动消费#拔草,
2022/7/8 22:15,奶茶,支出,12.5,,,茶百道(此行数据是示例,可以删除),不计收支&预算,,,,`)

func TestUnmarshal(t *testing.T) {
	records, err := csv.Unmarshal[Test](data)
	if err != nil {
		t.Fatal(err)
	}
	for i, record := range records {
		t.Logf("record#%d: %v\n", i, record)
	}
}

func TestMarshal(t *testing.T) {
	records, err := csv.Unmarshal[Test](data)
	if err != nil {
		t.Fatal(err)
	}
	// use csv.Ordered
	p, err := csv.Marshal(records)
	if err != nil {
		t.Fatal(err)
	}
	t.Log(string(p))
}
控制台
时间,类型,金额,备注,标签
2022/7/12 21:20,支出,28.58,去肯德基吃汉堡(此行数据是示例,可以删除),种草
2022/7/8 22:15,收入,1000,7月份工资(此行数据是示例,可以删除),#老婆#旅行
2022/7/8 10:10,转账,200,支付宝提现1000元到银行卡(此行数据是示例,可以删除),#冲动消费#拔草
2022/7/8 22:15,支出,12.5,茶百道(此行数据是示例,可以删除),

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Marshal

func Marshal[T any](records []T) (p []byte, err error)

func MarshalCSVWriter

func MarshalCSVWriter[T any](writer *stdcsv.Writer, records []T) error

func MarshalFile

func MarshalFile[T any](filename string, records []T) (err error)

func MarshalWriter

func MarshalWriter[T any](r io.Writer, records []T) error

func Unmarshal

func Unmarshal[T any](data []byte) (records []T, err error)

func UnmarshalCSVReader

func UnmarshalCSVReader[T any](reader *stdcsv.Reader) ([]T, error)

func UnmarshalFile

func UnmarshalFile[T any](filename string) (records []T, err error)

func UnmarshalReader

func UnmarshalReader[T any](r io.Reader) ([]T, error)

Types

type Marshaler

type Marshaler interface {
	MarshalCSV() (string, error)
}

type Ordered

type Ordered interface {
	OrderedCSV() []string
}

type Unmarshaler

type Unmarshaler interface {
	UnmarshalCSV(string) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL