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")
}
注意事项
- 结构体字段必须导出(首字母大写)
- CSV文件默认第一行应该是标题行
- 字段类型支持: string, int, float64, bool
- 如果CSV中的列不存在于结构体标签中,该列会被忽略
- 可以使用omitempty选项处理可选列
go-csv-tag是一个简单易用的库,特别适合处理结构化的CSV数据。它减少了手动解析CSV的代码量,使得代码更加清晰和易于维护。