encoding/csv
读取和写入 CSV
encoding/csv 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
什么是 CSV
CSV(逗号分隔值)以纯文本形式存储表格数据,每条记录占一行,字段之间用逗号分隔。Go 的 encoding/csv 包可以读取和写入 CSV。
从字符串读取
从任意 io.Reader 创建读取器。strings.NewReader 会封装一个字符串,因此我们无需使用文件就能演示。
package main
import (
"encoding/csv"
"fmt"
"strings"
)
func main() {
r := csv.NewReader(strings.NewReader("a,b,c"))
rec, _ := r.Read()
fmt.Println(rec)
}读取所有记录
ReadAll 会将每一行读取到 [][]string 中。每个内部切片表示一条记录的字段。
package main
import (
"encoding/csv"
"fmt"
"strings"
)
func main() {
data := "name,age\nAnn,30\nBob,25"
r := csv.NewReader(strings.NewReader(data))
records, _ := r.ReadAll()
fmt.Println(records)
}逐行读取
对于大型文件,请使用 Read 一次读取一条记录。读取完成后,它会返回 io.EOF。
package main
import (
"encoding/csv"
"fmt"
"io"
"strings"
)
func main() {
r := csv.NewReader(strings.NewReader("a,1\nb,2"))
for {
rec, err := r.Read()
if err == io.EOF {
break
}
fmt.Println(rec)
}
}访问字段
每条记录都是一个字符串切片。通过索引访问它即可读取某一列。
package main
import (
"encoding/csv"
"fmt"
"strings"
)
func main() {
r := csv.NewReader(strings.NewReader("Ann,30"))
rec, _ := r.Read()
fmt.Println("name:", rec[0], "age:", rec[1])
}自定义分隔符
设置 r.Comma 即可使用其他分隔符,例如分号或制表符。
package main
import (
"encoding/csv"
"fmt"
"strings"
)
func main() {
r := csv.NewReader(strings.NewReader("a;b;c"))
r.Comma = ';'
rec, _ := r.Read()
fmt.Println(rec)
}写入 CSV
csv.NewWriter 用于写入记录。调用 Flush 将缓冲的数据写出。
package main
import (
"encoding/csv"
"os"
)
func main() {
w := csv.NewWriter(os.Stdout)
w.Write([]string{"name", "age"})
w.Write([]string{"Ann", "30"})
w.Flush()
}写入多行
WriteAll 一次写入完整的 [][]string,并自动刷新。
package main
import (
"encoding/csv"
"os"
)
func main() {
w := csv.NewWriter(os.Stdout)
rows := [][]string{{"a", "1"}, {"b", "2"}}
w.WriteAll(rows)
}自动加引号
如果字段包含逗号、引号或换行符,写入器会自动为其加引号,从而确保输出仍是有效的 CSV。
package main
import (
"encoding/csv"
"os"
)
func main() {
w := csv.NewWriter(os.Stdout)
w.Write([]string{"hello, world", "plain"})
w.Flush()
}不要忘记 Flush
写入器会缓冲数据。如果忘记调用 Flush(并且没有使用 WriteAll),某些行可能永远不会被写入。程序结束前请务必刷新。
处理错误
刷新后,请检查 w.Error(),以捕获缓冲期间发生的任何写入失败。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
w := csv.NewWriter(os.Stdout)
w.Write([]string{"x", "y"})
w.Flush()
fmt.Fprintln(os.Stderr, w.Error())
}快速检查
CSV 读取器的 ReadAll 会为解析后的数据返回什么?
回顾
encoding/csv:
- 使用
csv.NewReader搭配Read或ReadAll - 使用
csv.NewWriter搭配Write/WriteAll,然后调用Flush - 设置
Comma使用自定义分隔符;加引号会自动完成
常见问题解答
「encoding/csv」课时是免费的吗?
是的 — 「encoding/csv」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「encoding/csv」这节课中我会学到什么?
读取和写入 CSV 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「encoding/csv」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- encoding/json 回顾
- encoding/xml
- encoding/csv
- gob 与二进制编码