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

标签 dictionary go struct export-to-csv

我有一个 map ,其中有一个结构作为值,如下所示:

type Record struct {
    ID   int
    Type string
    Year string
}

m := make(map[int]Record)

当我用一些记录填充此 map 后,我尝试将它们导出为 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()

我收到错误len 的参数值(记录类型)无效。我应该如何处理这里的结构?我必须以某种方式将其转换为字符串吗?

最佳答案

这里有几个问题:

  1. writer.Write 接受 []string 类型的参数,因此尝试将字符串以外的任何内容附加到 r (我假设是记录的简写表示)将不起作用。
  2. 您无法获取结构体的长度。请参阅builtin有关可以传递给 len 的类型的更多信息的文档。

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

  • 为 csv 提供标题以方便阅读
  • 更新r以接受len(headers)的容量,等于4-我不确定您想要的容量是什么,但您可以轻松地将其更新为是(可能是 3,而不是 4)。
  • 将 ID 字段转换为字符串,以便添加到 writer.Write[]string

测试here在 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)
}

关于dictionary - 使用 Golang 将包含结构体作为值的映射导出到 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54964781/

相关文章:

c++ - 如何将动态结构数组传递给成员函数?

c++ - 查找 vector 中是否存在相同结构的最快方法

python - 将字符串中的每个字符替换为字典中的 float ,并将所有替换值相加

python - csv.DictWriter 定界符设置为空格表示 ""中的文本

go - 如何在 Go 结构(golang)中存储 unicode

database - 如何从 interface{} 值(反射)为显式类型的结构成员设置新值?戈朗

c - 改进了在结构指针内为结构双指针动态分配内存的方法

python - 创建新列表并附加到字典

ios - 无法将类型 '[(String)]' 的值分配给类型 'String!' 的值?

go - 要同时启动Kafka使用者和HTTP服务器?