为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
翻翻过去那场雪 2023-06-12 15:48:08
我有一个以结构为值的地图,如下所示: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。我应该如何处理这里的结构?我必须以某种方式将它转换为字符串吗?
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

这里有几个问题:

  1. writer.Write采用 type 的参数[]string,因此尝试将字符串以外的任何内容附加到(我假设是recordr的简写表示)将不起作用。

  2. 您无法获得结构的长度。

我对您的代码做了一些修改:

  • 为 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 records


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

checkError("Error:", err)

defer file.Close()

writer := csv.NewWriter(file)

defer writer.Flush()


// define column headers

headers := []string{

    "id",

    "type",

    "year",

}


// write column headers

writer.Write(headers)


var idString string


for 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)

}


查看完整回答
反对 回复 2023-06-12
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您的代码有几个问题。尝试这样的事情:


package main


import (

    "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.csv

1,A,2019


查看完整回答
反对 回复 2023-06-12
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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()


查看完整回答
反对 回复 2023-06-12
  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信