Golang CSV文件处理

我在用Golang处理CSV文件时遇到几个问题:

  1. 读取包含中文的CSV文件时出现乱码,该如何正确设置编码?
  2. 处理大型CSV文件(超过100MB)时内存占用过高,有没有高效的流式读取方法?
  3. 写入CSV时如何自动处理包含逗号或换行符的字段?
  4. 标准库encoding/csv和第三方库(如gocsv)哪个更适合实际项目?

希望能得到有实际项目经验的前辈指点,最好能提供示例代码。

2 回复

使用Golang处理CSV文件,推荐使用标准库encoding/csv
主要方法:

  • csv.NewReader() 读取文件
  • csv.NewWriter() 写入文件
  • 支持自定义分隔符、逗号转义等
    示例:逐行读取并解析CSV数据,或写入切片数据到CSV。
    注意处理编码和字段引号。

更多关于Golang CSV文件处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中处理CSV文件可以使用标准库 encoding/csv,以下是常见操作示例:

1. 读取CSV文件

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("data.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }

    for _, row := range records {
        for _, col := range row {
            fmt.Printf("%s ", col)
        }
        fmt.Println()
    }
}

2. 写入CSV文件

func writeCSV() {
    file, err := os.Create("output.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    data := [][]string{
        {"Name", "Age", "City"},
        {"John", "23", "New York"},
        {"Jane", "27", "London"},
    }

    for _, row := range data {
        err := writer.Write(row)
        if err != nil {
            panic(err)
        }
    }
}

3. 常用配置选项

reader := csv.NewReader(file)
reader.Comma = ';'       // 设置分隔符(默认逗号)
reader.Comment = '#'      // 设置注释标识符
reader.FieldsPerRecord = 3 // 设置每行期望的字段数

writer := csv.NewWriter(file)
writer.Comma = '\t'       // 设置制表符分隔

4. 逐行读取(大文件优化)

func readLargeCSV() {
    file, _ := os.Open("large.csv")
    defer file.Close()

    reader := csv.NewReader(file)
    for {
        record, err := reader.Read()
        if err == io.EOF {
            break
        }
        if err != nil {
            panic(err)
        }
        fmt.Println(record)
    }
}

注意事项:

  1. 始终检查错误处理
  2. 使用 defer 确保文件正确关闭
  3. 大文件建议使用 Read() 逐行读取
  4. 可通过 reader.FieldsPerRecord 验证数据完整性

需要处理特殊格式(如引号、换行符)时,库会自动处理符合RFC 4180标准的格式。

回到顶部