繁体   English   中英

逐行读取 CSV 并将其解组为结构

[英]Read a CSV line by line and unmarshal it to a struct

我有一个 8 gigs CSV 文件,我需要将其解组为结构列表

package main

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

    gocsv "github.com/gocarina/gocsv"
    dto "github.com/toto/GeoTransport/import/dto"
)

// Put in parameter json the csv names
func importAdresse() {
    var adressesDB []dto.GeoAdresse
    clientsFile, err := os.OpenFile("../../../data/geo/public.geo_adresse.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {
        panic(err)
    }
    gocsv.SetCSVReader(func(in io.Reader) gocsv.CSVReader {
        r := csv.NewReader(in)
        r.Comma = ';'
        return r // Allows use pipe as delimiter
    })
    if err = gocsv.UnmarshalFile(clientsFile, &adressesDB); err != nil { // Load clients from file
        panic(err)
    }
    var i int
    i = 0
    for _, adresse := range adressesDB {
        fmt.Println("adresse.Numero")
        fmt.Printf("%+v\n", adresse)
        fmt.Println(adresse.Numero)
        i++
        if i == 3 {
            break
        }
    }
}

func init() {
}

func main() {
    importAdresse()
}

实际上我正在使用 go csv 来解组它,但我有一些 memory 错误。

该程序退出,因为它没有足够的内存。

我想知道如何逐行阅读 csv 并将其解组为结构。

解决方案之一是使用一些 unix 命令拆分 CSV 文件。

但我想知道如何仅使用 Go 来做到这一点。

看起来您使用的解析方法试图将整个 CSV 文件读入 memory 您可以尝试直接使用标准的 CSV 阅读器 package ,或者使用另一个允许像这样逐行解码的 CSV-to-struct 库。 这些页面上的示例代码是否显示了您要查找的内容?

要尝试的另一件事是运行wc -l../../../data/geo/public.geo_adresse.csv以获取 CSV 文件中的行数,然后写下:

var adressesDB [<number of lines in your CSV>]dto.GeoAdresse

如果运行时在该行上引发 out of memory 异常,则意味着未编组的 CSV 数据超出了您的 RAM 容量,您必须分块读取它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM