Go语言处理CSV数据

csv(Comma-Seperated Vaules), 指以纯文本形式存储表格数据(https://www.rfc-editor.org/rfc/rfc4180.html)。Go语言内置包encoding/csv用来处理csv数据。

写入csv文件:

import (
	"encoding/csv"
	"fmt"
	"os"
)

func generateCsv(file *os.File, data []string) error {
	// NewWriter返回一个Writer对象
	writer := csv.NewWriter(file)
	// 调用Write方法将数据写入文件
	err := writer.Write(data)
	if err != nil {
		return err
	}
	writer.Flush()
	return nil
}

func main() {
	var data = map[string][]string{
		"row1": {"id", "name", "score"},
		"row2": {"001", "Jack", "95"},
		"row3": {"002", "John", "73"},
		"row4": {"003", "Robert", "99"},
	}
	
	// os.Create创建文件,创建成功则返回文件指针对象*File
	f, err := os.Create("data.csv")
	if err != nil {
		return
	}

	defer func(file *os.File) {
		err := f.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(f)

	rowsArray := []string{"row1", "row2", "row3", "row4"}
	for _, row := range rowsArray {
		r, ok := data[row]
		if !ok {
			return
		}
		err := generateCsv(f, r)
		if err != nil {
			fmt.Println(err)
			return
		}
	}

}

读取csv文件:

import (
	"encoding/csv"
	"fmt"
	"io"
	"os"
	"path/filepath"
)

func main() {
	// os.Open打开文件,如果打开成功返回一个文件指针对象*File
	// filepath.Join会自动根据操作系统类型将路径拼接到一起,提高代码健壮性
	f, err := os.Open(filepath.Join("data.csv"))
	if err != nil {
		fmt.Println(err)
		return
	}

	defer func(f *os.File) {
		err := f.Close()
		if err != nil {
			fmt.Println(err)
		}
	}(f)

	// NewReader()返回一个Reader结构体
	reader := csv.NewReader(f)
	// 设置字段分隔符。此处为什么采用英文分号";"?因为Reader默认分隔符是因为逗号,此处覆盖默认分隔符(也可以
	// 其他符号,必须是有效的rune类型符号并且不能使用换行”\n或者\r\n“),使其原样输出csv文件内容
	reader.Comma = ';'

	for {
		r, err := reader.Read()
		if err != nil {
			if err == io.EOF {
				break
			} else {
				fmt.Println(err)
				break
			}
		}
		fmt.Println(r)
	}
}

// [id,name,score]
// [001,Jack,95]
// [002,John,73]
// [003,Robert,99]

参考:https://pkg.go.dev/encoding/csv@go1.20.5#Reader.Comma

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务