gocsv解析字节失败

huangapple go评论91阅读模式
英文:

gocsv UnmarshalBytes fail

问题

当我调用以下函数时,我得到错误信息parse error on line 2, column 25: bare "" in non-quoted-field。你能告诉我为什么会出现这个错误吗?我该如何修复它?

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:]
	}
	
	if err := gocsv.UnmarshalBytes(data, obj); err != nil { // Load clie
		fmt.Println(err) // nts from file
		return err
	}
	return nil
}

当你调用这个函数时,出现错误的原因是在第2行第25列有一个裸露的引号(bare "" in non-quoted-field)。你可以通过检查代码中的引号使用情况来修复这个错误。确保所有的引号都被正确地引用或转义。

英文:

When I call the following function, I get err parse error on line 2, column 25: bare " in non-quoted-field Can you tell me why this is happening? How do I fix it?

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:]
	}
	
	if err := gocsv.UnmarshalBytes(data, obj); err != nil { // Load clie
		fmt.Println(err) // nts from file
		return err
	}
	return nil
}

答案1

得分: 1

在gocsv的GitHub上有一个未解决的问题。用户报告了完全相同的问题,可能是由于UTF-8 BOM编码引起的。

将以下代码片段替换为应该可以解决问题:

if err := gocsv.UnmarshalBytes(data, obj); err != nil { // 从文件加载数据
    fmt.Println(err)
    return err
}

替换为:

in := csv.NewReader(transform.NewReader(bytes.NewReader(data), unicode.UTF8BOM.NewDecoder()))
if err := gocsv.UnmarshalCSV(in, obj); err != nil { // 从文件加载数据
    fmt.Println(err)
    return err
}

更多详情请参考这里

英文:

There is an solved issue on the gocsv github. The user reports the exact same issue, likely due to UTF-8 BOM encoding.

Replacing

if err := gocsv.UnmarshalBytes(data, obj); err != nil { // Load clie
    fmt.Println(err) // nts from file
    return err
}

with

in := csv.NewReader(transform.NewReader(bytes.NewReader(data), unicode.UTF8BOM.NewDecoder()))
if err := gocsv.UnmarshalCSV(in, obj); err != nil { // Load clie
    fmt.Println(err) // nts from file
    return err
}

should fix it.

huangapple
  • 本文由 发表于 2021年11月15日 17:29:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/69972102.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定