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)
}
}
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)
}
}
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题