0Pricing
Go Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. encoding/json 回顾
  2. encoding/xml
  3. encoding/csv
  4. gob 与二进制编码
← 返回 Go Academy