【问题标题】:Writing a map to a csv将地图写入 csv
【发布时间】:2017-11-27 18:11:26
【问题描述】:

我一直试图弄清楚如何正确地将地图写入 csv 文件,但没有成功。

我基本上有一个查询 sql 数据库的程序,我将其中一个返回值存储为映射的键,然后将一段字符串用于返回与其相关的数据,例如映射将是:

var m = make(map[string][]string)

m['test1'] = [5, 4, 3]

所以将其写入 csv 将是

测试1、5、4、3

它像列表/切片一样打印到 csv 中,我将其存储在地图中以便更容易在其他地方构建动态查询。

我尝试过使用 for 循环:

for key, value := range m{
    writer.Write(key)
    writer.Write(value)
}

但我收到以下错误:

不能在 writer.Write 的参数中使用键(类型字符串)作为类型 []string

我在这里进行了很多谷歌搜索和搜索,但似乎无法找到正确执行此操作的方法。

【问题讨论】:

  • 您必须构造一个临时的字符串切片,将索引 0 设置为映射键并附加映射值。

标签: csv go


【解决方案1】:

Package csv

func (*Writer) Write

func (w *Writer) Write(record []string) error

Writer 将单个 CSV 记录连同任何必要的内容一起写入 w 引用。一条记录是一段字符串,每个字符串为一个 字段。


错误:不能在参数中使用键(类型string)作为类型[]string writer.Write


“我在这里做了很多谷歌搜索。”

要解决这个问题,请阅读Write 的文档并按照错误消息中的说明进行操作,您输入了stringWrite 想要输入[]string。例如,

for key, value := range m {
    r := make([]string, 0, 1+len(value))
    r = append(r, key)
    r = append(r, value...)
    err := writer.Write(r)
    if err != nil {
        // handle error
    }
}
writer.Flush()

【讨论】:

  • 谢谢!我对语言有点陌生,有些文档有点令人困惑,这是完全有道理的,试图避免制作临时切片,但似乎这是这样做的方法。谢谢!
  • @Dangle:切片是struct,具有长度、容量和指向底层数组的指针,在 64 位架构上为 24 ( 3 *( 64 / 8)) 字节. make([]string, 0, 1+len(value)) 为切片的底层数组strings 分配了确切的大小,这避免了append 期间的重新分配。 stringstruct,具有长度和指向底层字符串字节的指针。
  • @Dangle:创建 r 的值时,我们正在分配和复制切片描述符 (structs)。我们不分配或复制字符串值,只分配指向它们的指针。所以不是很贵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多