Go encondig/csv库


CSV读取
encondig/csv库 提供了 实用函数的API 避免重复造轮子 Go 标准库文档 //golang.org/pkg/

加载
import "encondig/csv"
声明 csv 源代码所在路径  /path/to/go/src/encondig/csv
包需要提供 的输入 即参数  返回的数据类型
CSV读写符合 "RFC 4180" 标准的要求 类似于"field1,field2,field3",
要保证 field 不应该存在额外的逗号 为了已经有了逗号 那么就需要在两端加上引号
对于被引号包围的字符串 会默认移除两边的引号 如果 想保留引号 就得用两个引号
## 输入
"the ""word"" is true","a ""quoted-field"""
"Multi-line
field","comma is ,"
## 输出
{`the "word" is true`, `a "quoted-field"`}
{`Multi-line
field`, `comma is ,`}

在换行符移除前进行归位(carriage return) 即回到一行字的开头 但是不代表换行
包定义 变量 数据类型  返回 数据的函数 函数 有案例帮助理解

package main
import (
    "encoding/csv"
    "fmt"
    "io"
    "log"
    "strings"
)
// 导入多个标准包 fmt用于标准化输出,io为输入输出相关 log用于记录日志 strings是强化的字符类型
func main() {
in := `first_name,last_name,username
"Rob","Pike",rob
Ken,Thompson,ken
"Robert","Griesemer","gri"
`
// 用``可以多行输入
r := csv.NewReader(strings.NewReader(in))
//调用strings.NewReader函数读取字符串 返回Reader结构体的指针 而Reader实现io.Reader
//使用csv.NewReader函数读取io.Reader, 返回csv包定义的Reader结构体的指针
for {
    record, err := r.Read()
    //Reader实例的Read方法
    //一般情况下返回字符数组和ErrFieldCount(用于判断每一行的列数是否都相同)
    //否则返回的err为non-nil record或non-nil error 没有数据返回io.EOF
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(record)
}
}
将要读取的csv格式的字符串放在了代码中 实际情况下可以将这部分代码保存为'test.csv' 然后想办法给 strings.NewReader 提供字符串数据类型
策略是用ioutil.ReadFile读取所有字符得到字符数组[]byte 然后将字符数组显式转换字符串数据类型


package main
import (
    "encoding/csv"
    "fmt"
    "io/ioutil"
    "log"
    "strings"
    "io"
)

func main() {
    dat, err := ioutil.ReadFile("test.csv")
    if err != nil {
        log.Fatal(err)
    }
    r := csv.NewReader(strings.NewReader(string(dat[:])))
    for {
        record, err := r.Read()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(record)
    }
}