Golang CSV文件处理
我在用Golang处理CSV文件时遇到几个问题:
- 读取包含中文的CSV文件时出现乱码,该如何正确设置编码?
 - 处理大型CSV文件(超过100MB)时内存占用过高,有没有高效的流式读取方法?
 - 写入CSV时如何自动处理包含逗号或换行符的字段?
 - 标准库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)
    }
}
注意事项:
- 始终检查错误处理
 - 使用 
defer确保文件正确关闭 - 大文件建议使用 
Read()逐行读取 - 可通过 
reader.FieldsPerRecord验证数据完整性 
需要处理特殊格式(如引号、换行符)时,库会自动处理符合RFC 4180标准的格式。
        
      
                    
                    
                    
