golang通过标签加载CSV文件的插件库go-csv-tag的使用

golang通过标签加载CSV文件的插件库go-csv-tag的使用

安装

go get github.com/artonge/go-csv-tag/v2

示例

从CSV文件加载数据

CSV文件内容:

name, ID, number
name1, 1, 1.2
name2, 2, 2.3
name3, 3, 3.4

Go代码:

type Demo struct {                                // 带有标签的结构体
	Name string  `csv:"name"`
	ID   int     `csv:"ID"`
	Num  float64 `csv:"number"`
}

tab := []Demo{}                                   // 创建用于存放内容的切片
err  := csvtag.LoadFromPath(
	"file.csv",                                   // CSV文件路径
	&tab,                                         // 指向创建的切片的指针
	csvtag.CsvOptions{                            // 加载CSV的可选选项
		Separator: ';',                           // 更改值分隔符,默认为','
		Header: []string{"name", "ID", "number"}, // 指定自定义标题
		TagKey: "csv",                            // 指定自定义标签键,默认为'csv'
})

你也可以从io.Reader加载数据:

csvtag.LoadFromReader(youReader, &tab)

或者从字符串加载:

csvtag.LoadFromString(yourString, &tab)

将数据转储到CSV文件

Go代码:

type Demo struct {                         // 带有标签的结构体
	Name string  `csv:"name"`
	ID   int     `csv:"ID"`
	Num  float64 `csv:"number"`
}

tab := []Demo{                             // 创建包含内容的切片
	Demo{
		Name: "some name",
		ID: 1,
		Num: 42.5,
	},
}

err := csvtag.DumpToFile(tab, "csv_file_name.csv")

你也可以将数据转储到io.Writer:

err := csvtag.DumpToWriter(tab, yourIOWriter)

或者转储为字符串:

str, err := csvtag.DumpToString(tab)

生成的CSV文件内容:

name,ID,number
some name,1,42.5

注意:该项目目前处于维护模式,会保持与Go生态系统的兼容性,但不会开发新功能。


更多关于golang通过标签加载CSV文件的插件库go-csv-tag的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通过标签加载CSV文件的插件库go-csv-tag的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-csv-tag加载CSV文件

go-csv-tag是一个方便的Golang库,它允许你通过结构体标签来加载CSV文件内容到结构体中。下面我将详细介绍如何使用这个库。

安装go-csv-tag

首先,使用go get安装这个库:

go get github.com/artonge/go-csv-tag

基本用法

1. 定义带标签的结构体

type Person struct {
    Name    string `csv:"name"`
    Age     int    `csv:"age"`
    Email   string `csv:"email"`
    Address string `csv:"address,omitempty"` // omitempty表示如果CSV中没有该列,则使用零值
}

2. 加载CSV文件

package main

import (
    "fmt"
    "github.com/artonge/go-csv-tag"
)

func main() {
    // 定义目标结构体切片
    var people []Person
    
    // 加载CSV文件
    err := csvtag.Load("people.csv", &people)
    if err != nil {
        panic(err)
    }
    
    // 打印加载的数据
    for _, person := range people {
        fmt.Printf("%+v\n", person)
    }
}

高级用法

1. 自定义分隔符

config := csvtag.Config{
    Separator: ';', // 使用分号作为分隔符
}
err := csvtag.LoadFromConfig("people.csv", &people, config)

2. 从字符串加载

csvContent := `name,age,email
John,30,john@example.com
Jane,25,jane@example.com`

err := csvtag.Decode([]byte(csvContent), &people)

3. 处理没有标题行的CSV

config := csvtag.Config{
    Header: []string{"name", "age", "email"}, // 手动指定标题行
}
err := csvtag.LoadFromConfig("no_header.csv", &people, config)

4. 写入CSV文件

people := []Person{
    {Name: "John", Age: 30, Email: "john@example.com"},
    {Name: "Jane", Age: 25, Email: "jane@example.com"},
}

err := csvtag.DumpToFile(people, "output.csv")
if err != nil {
    panic(err)
}

完整示例

package main

import (
    "fmt"
    "github.com/artonge/go-csv-tag"
)

type Employee struct {
    ID        int     `csv:"employee_id"`
    FirstName string  `csv:"first_name"`
    LastName  string  `csv:"last_name"`
    Salary    float64 `csv:"salary"`
    Department string `csv:"department"`
}

func main() {
    // 从CSV加载数据
    var employees []Employee
    err := csvtag.Load("employees.csv", &employees)
    if err != nil {
        panic(fmt.Sprintf("Error loading CSV: %v", err))
    }
    
    // 打印加载的数据
    fmt.Println("Loaded employees:")
    for _, emp := range employees {
        fmt.Printf("%+v\n", emp)
    }
    
    // 修改数据并保存
    employees = append(employees, Employee{
        ID:        100,
        FirstName: "New",
        LastName:  "Employee",
        Salary:    50000,
        Department: "IT",
    })
    
    err = csvtag.DumpToFile(employees, "updated_employees.csv")
    if err != nil {
        panic(fmt.Sprintf("Error saving CSV: %v", err))
    }
    fmt.Println("CSV file updated successfully")
}

注意事项

  1. 结构体字段必须导出(首字母大写)
  2. CSV文件默认第一行应该是标题行
  3. 字段类型支持: string, int, float64, bool
  4. 如果CSV中的列不存在于结构体标签中,该列会被忽略
  5. 可以使用omitempty选项处理可选列

go-csv-tag是一个简单易用的库,特别适合处理结构化的CSV数据。它减少了手动解析CSV的代码量,使得代码更加清晰和易于维护。

回到顶部