Go语言轻松读取CSV文件:介绍丰富实用的代码示例

引言

本文详细介绍了如何使用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文件更加灵活和高效。

タイトルとURLをコピーしました