我有一个 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 上的工作示例。