首页 > 文章列表 > gocsv 无法读取带有引用字段的内容

gocsv 无法读取带有引用字段的内容

145 2024-04-25
问题内容

我有一个 csv 响应,该响应来自我无法控制的端点,但我无法解析其响应,因为它包含引号。它看起来像这样:

name,id,quantity,"status (active, expired)"
john,14,4,active 
bob,12,7,expired

为了解析此响应,我创建了以下结构:

type userinfo struct {
name     string `csv:"name"`
id       string `csv:"id"`
quantity string `csv:"quantity"`
status   string `csv:"status (active, expired)"`
}

我尝试过使用

status   string `csv:""status (active, expired)""`
status   string `csv:'"status (active, expired)"'`

但似乎没有任何帮助,当我使用 gocsv.unmarshal 时,我无法访问字段状态。

var actualResult []UserInfo
err = gocsv.Unmarshal(in, &actualResult)

for _, elem := range actualResult {
    fmt.Println(elem.Status)
    }

我没有得到任何回应。

https://go.dev/play/p/lje1zno9w6e 这是一个示例


正确答案


你不需要像 gocsv 这样的第三方包(除非你有特定的用例),因为它可以使用 go 的内置轻松完成 encoding/csv

您只需忽略端点响应中的第一行/记录,即 csv header

csvReader := csv.NewReader(strings.NewReader(csvString))

records, err := csvReader.ReadAll()
if err != nil {
    panic(err)
}

var users []UserInfo

// Iterate over all records excluding first one i.e., header
for _, record := range records[1:] {
    users = append(users, UserInfo{Name: record[0], ID: record[1], Quantity: record[2], Status: record[3]})
}

fmt.Printf("%v", users)
// Output: [{ John 14 4 active } { Bob 12 7 expired}]

这是基于您的用例和示例字符串的go playground 上的工作示例