猿问

使用 Golang 将包含结构作为值的映射导出到 csv

我有一个以结构为值的地图,如下所示:


type Record struct {

    ID   int

    Type string

    Year string

}


m := make(map[int]Record)

用一些记录填充此地图后,我将尝试将它们导出为 csv:


file, err := os.Create("export.csv")

checkError("Error:", err)

defer file.Close()

writer := csv.NewWriter(file)

defer writer.Flush()


for key, value := range m {

    r := make([]string, 0, 1+len(value))

    r = append(r, key)

    r = append(r, value)

}

writer.Flush()

我收到了错误invalid argument value (type Record) for len。我应该如何处理这里的结构?我必须以某种方式将它转换为字符串吗?


翻翻过去那场雪
浏览 198回答 3
3回答

慕婉清6462132

这里有几个问题:writer.Write采用 type 的参数[]string,因此尝试将字符串以外的任何内容附加到(我假设是recordr的简写表示)将不起作用。您无法获得结构的长度。我对您的代码做了一些修改:为 csv 提供标题以便于阅读更新r以接受等于 4 的容量len(headers)- 我不确定您想要的容量是什么,但您可以轻松地将其更新为(可能是 3,而不是 4)。将 ID 字段转换为字符串以便添加到[]stringforwriter.Write在 Go Playground中进行测试。例子:type Record struct {    ID   int    Type string    Year string}m := make(map[int]Record)// populate this map with some recordsfile, err := os.Create("export.csv")checkError("Error:", err)defer file.Close()writer := csv.NewWriter(file)defer writer.Flush()// define column headersheaders := []string{    "id",    "type",    "year",}// write column headerswriter.Write(headers)var idString stringfor key := range m {    r := make([]string, 0, 1+len(headers)) // capacity of 4, 1 + the number of properties your struct has & the number of column headers you are passing    // convert the Record.ID to a string in order to pass into []string    idString = strconv.Itoa(m[key].ID)    r = append(        r,        idString,        m[key].Type,        m[key].Year,    )    writer.Write(r)}

MMMHUHU

您的代码有几个问题。尝试这样的事情:package mainimport (    "encoding/csv"    "os"    "strconv")func main() {    type Record struct {        ID   int        Type string        Year string    }    m := make(map[int]Record)    r := Record{ID: 1, Type: "A", Year: "2019"}    m[r.ID] = r    f, err := os.Create("export.csv")    if err != nil {        // handle error    }    defer f.Close()    w := csv.NewWriter(f)    defer w.Flush()    for _, v := range m {        r := make([]string, 0, 3)        r = append(r, strconv.Itoa(v.ID))        r = append(r, v.Type)        r = append(r, v.Year)        err := w.Write(r)        if err != nil {            // handle error        }    }}输出:$ go run export.go$ cat export.csv1,A,2019$ 

红颜莎娜

len()您正在尝试在结构而不是地图上应用尝试以下操作:file, err := os.Create("export.csv")checkError("Error:", err)defer file.Close()writer := csv.NewWriter(file)defer writer.Flush()r := make([]string, 0, 1+len(m))for key, value := range m {    r = append(r, key)    r = append(r, value)}writer.Flush()
随时随地看视频慕课网APP

相关分类

Go
我要回答