调用gocsv.UnmarshalBytes出现bare " in non-quoted-field报错如何解决
bare " in non-quoted-field报错原因及修复方案 报错根因
该报错由gocsv依赖的Go标准库encoding/csv严格校验CSV格式时抛出,触发原因是CSV内容不符合RFC 4180规范:
- 非双引号包裹的字段内,出现了未转义的双引号字符,你可以优先检查CSV第二行第25列附近的字段内容,大概率存在类似
xxx"yyy的格式,字段没有用双引号包裹但内部直接写了双引号。
规范要求:如果CSV字段内部包含双引号,必须将整个字段用双引号包裹,同时将字段内的单个双引号转义为两个连续的双引号,合法格式示例:
"xxx""yyy"。
修复方案
方案1:修正源CSV文件(最推荐)
如果可以修改原始CSV数据,直接调整不符合规范的字段即可:
- 给包含双引号的字段外层套双引号
- 把字段内所有单个双引号替换为两个连续双引号
方案2:代码层兼容非标准CSV(无法修改源文件时使用)
默认gocsv.UnmarshalBytes使用严格校验模式,你可以自定义CSV Reader开启宽松解析,修改后的代码如下:
import ( "bytes" "encoding/csv" // 其余原有导入保持不变 ) func ParseFromCSV(data []byte, obj interface{}) error { encode := GetEncode(data) if encode == GBK { var err error data, err = ConvertGBK2UTF8(data) if err != nil { return err } } bom := []byte{0xEF, 0xBB, 0xBF} if len(data) > len(bom) && data[0] == bom[0] && data[1] == bom[1] && data[2] == bom[2] { data = data[3:] } // 自定义CSV Reader,开启宽松模式兼容非标准格式 csvReader := csv.NewReader(bytes.NewReader(data)) // 允许非引号包裹的字段中出现未转义的双引号 csvReader.LazyQuotes = true // 若你的CSV分隔符不是逗号,可额外配置:csvReader.Comma = ';' if err := gocsv.UnmarshalCSV(csvReader, obj); err != nil { fmt.Println(err) return err } return nil }
内容的提问来源于stack exchange,提问作者zqm
相关产品推荐
相关产品推荐

