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



我有一个8 gb的CSV文件,我需要解组到struct的列表

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("%+vn", adresse)
fmt.Println(adresse.Numero)
i++
if i == 3 {
break
}
}
}
func init() {
}
func main() {
importAdresse()
}

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

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

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

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

但是我想知道如何只用Go来做。

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

另一种尝试是运行wc -l ../../../data/geo/public.geo_adresse.csv来获取CSV文件中的行数,然后这样写:
var adressesDB [<number of lines in your CSV>]dto.GeoAdresse

如果运行时在该行上引发内存不足异常,这意味着未编组的CSV数据超过了您的RAM容量,您将不得不以块的形式读取它。

最新更新