GoCSV:将2个csv列连接成一个struct成员

时间:2017-04-14 06:54:00

标签: csv go

我可以将2个csv列连接到一个带Go CSV的结构成员吗?

CSV格式是这样的。

colA, date, time, colB
A1, 2017-04-14, 09:50:10, B1
A2, 2017-04-14, 09:50:20, B2

我想将此CSV映射到结构

type MyStruct struct { 
    ColA       string `csv:"colA"`
    DateTime   string  // <- like "2017-04-14 09:50:10"
    ColB       string `csv:"colB"`
}

如何使用Go CSV或Go中的其他方式执行此操作?

2 个答案:

答案 0 :(得分:1)

(a)我认为没有一种支持的方法可以做到这一点。但是,可以实现将字段合并到一起的自定义阅读器。相当专有,我不推荐它。

(b)为什么不简单地向MyStruct添加一个返回合并值的方法?

type MyStruct struct { 
    ColA       string `csv:"colA"`
    ColB       string `csv:"colB"`
    ColC       string `csv:"colC"`
}

func (m MyStruct) dateTime() string {
  return ColB+ColC
}

(c)在解析之前,可能会使用一些shell-fu来预处理CSV?

答案 1 :(得分:0)

csvutil 中的第一个示例是否回答/解决了这个问题?

    var csvInput = []byte(`
name,age,CreatedAt
jacek,26,2012-04-01T15:00:00Z
john,,0001-01-01T00:00:00Z`,
    )

    type User struct {
        Name      string `csv:"name"`
        Age       int    `csv:"age,omitempty"`
        CreatedAt time.Time
    }

    var users []User
    if err := csvutil.Unmarshal(csvInput, &users); err != nil {
        fmt.Println("error:", err)
    }

    for _, u := range users {
        fmt.Printf("%+v\n", u)
    }

    // Output:
    // {Name:jacek Age:26 CreatedAt:2012-04-01 15:00:00 +0000 UTC}
    // {Name:john Age:0 CreatedAt:0001-01-01 00:00:00 +0000 UTC}