引言
本文详细介绍了如何使用Go语言高效读取CSV文件。通过提供多个实际代码示例,帮助从初学者到高级开发者充分利用Go语言处理CSV文件的能力。
基础CSV读取
首先,我们来看看如何用Go语言读取一个基本的CSV文件。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
file, err := os.Open("example.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
panic(err)
}
for _, record := range records {
fmt.Println(record)
}
}
此代码打开example.csv
文件,读取内容并在屏幕上显示。
假设example.csv
文件内容如下:
姓名,年龄
张三,30
李四,25
使用自定义分隔符读取CSV
CSV文件可能使用逗号之外的其他分隔符。下面的示例使用分号作为分隔符来读取CSV文件。
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
file, err := os.Open("semicolon.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(file)
reader.Comma = ';'
records, err := reader.ReadAll()
if err != nil {
panic(err)
}
for _, record := range records {
fmt.Println(record)
}
}
假设semicolon.csv
文件内容如下:
姓名;年龄
王五;28
赵六;32
高效读取大型文件
处理大型CSV文件时,为减少内存使用,可以逐行读取。
package main
import (
"bufio"
"encoding/csv"
"fmt"
"os"
)
func main() {
file, err := os.Open("large.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(bufio.NewReader(file))
for {
record, err := reader.Read()
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
fmt.Println(record)
}
}
将CSV数据映射到结构体
将CSV数据映射到Go的结构体,可以更高效地处理数据。
package main
import (
"encoding/csv"
"fmt"
"os"
"strconv"
)
type Person struct {
Name string
Age int
}
func main() {
file, err := os.Open("people.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(file)
var people []Person
for {
record, err := reader.Read()
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
age, err := strconv.Atoi(record[1])
if err != nil {
panic(err)
}
people = append(people, Person{
Name: record[0],
Age: age,
})
}
for _, person := range people {
fmt.Printf("%s is %d years old.\n", person.Name, person.Age)
}
}
假设people.csv
文件内容如下:
姓名,年龄
孙七,45
周八,38
总结
Go语言读取CSV文件有多种方式。本文从基础读取到使用自定义分隔符、处理大型文件以及映射到结构体等多方面进行了介绍。掌握这些技术,可以使Go语言处理CSV文件更加灵活和高效。