登录
首页 >  Golang >  Go问答

解析 CSV 文件并将其转换为结构体

来源:stackoverflow

时间:2024-02-16 19:39:23 132浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《解析 CSV 文件并将其转换为结构体》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我有一个 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 来解组它,但我有一些内存错误。

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

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

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

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


解决方案


它看起来像您正在使用的解析方法 attempts to read the entire CSV file into memory。您可以尝试直接使用 standard CSV reader package,或者使用另一个允许逐行解码的 csv 到结构库,例如 this one。示例代码是否针对这些页面显示您要查找的内容?

另一件事是运行 wc -l ../../../data/geo/public.geo_adresse.csv 来获取 csv 文件中的行数,然后编写以下内容:

var adressesDB []dto.GeoAdresse

如果运行时在该行引发内存不足异常,则意味着未编组的 csv 数据超出了您的 ram 容量,您必须分块读取它。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>