【问题标题】:Write struct to csv file将结构写入csv文件
【发布时间】:2016-01-26 05:25:03
【问题描述】:

将结构转储到提供的 csv 文件中的惯用 golang 方法是什么?我在一个 func 中,我的结构作为 interface{} 传递:

func decode_and_csv(my_response *http.Response, my_struct interface{})

为什么是接口{}? - 从 JSON 读取数据,可能会返回几个不同的结构,因此尝试编写足够通用的函数。

我的类型示例:

type Location []struct {
    Name                   string `json: "Name"`
    Region                 string `json: "Region"`
    Type                   string `json: "Type"`
}

【问题讨论】:

    标签: csv go


    【解决方案1】:

    如果您使用具体类型会容易得多。您可能想要使用 encoding/csv 包,这是一个相关示例; https://golang.org/pkg/encoding/csv/#example_Writer

    如您所见,Write 方法需要 []string,因此为了生成它,您必须 1) 提供辅助方法或 2) 反映 my_struct。就个人而言,我更喜欢第一种方法,但这取决于您的需求。如果您想走第二条路线,您可以获取结构上的所有字段并将它们用作列标题,然后迭代获取每个字段的值,在该循环中使用 append 将它们添加到 []string 和然后将其传递给循环外的Write

    对于第一个选项,我会在每种类型上定义一个ToSlice 或其他东西,然后我会创建一个接口,称为CsvAble,它需要ToSlice 方法。更改方法my_struct CsvAble 中的类型而不是使用空接口,然后您可以在my_struct 上调用ToSlice 并将返回值传递给Write。您也可以返回列标题(这意味着您将返回一个[][]string 并需要迭代将每个[]string 传递到Write 的外部维度),或者您可能需要另一种方法来满足@987654339 之类的接口@ 返回一个[]string,它是列标题。如果是这种情况,您的代码将类似于;

    w := csv.NewWriter(os.Stdout)
    headers := my_struct.GetHeaders()
    values := my_struct.ToSlice()
    if err := w.Write(headers); err != nil {
        //write failed do something
    }
    if err := w.Write(values); err != nil {
        //write failed do something
    }
    

    如果这没有意义,请告诉我,我可以跟进这两种方法中的任何一种的代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多