golang报错:
parse error on line 1, column 4: bare " in non-quoted-field
可能的原因是csv是windowns 导出的,编码方式是UTF-8 BOM 方式。
可以通过跳过BOM解决:
import (
"os"
"log"
)
func main() {
fd, err := os.Open("filename")
if err != nil {
log.Fatal(err)
}
defer closeOrDie(fd)
bom := [3]byte
_, err = io.ReadFull(fd, bom[:])
if err != nil {
log.Fatal(err)
}
if bom[0] != 0xef || bom[1] != 0xbb || bom[2] != 0xbf {
_, err = fd.Seek(0, 0) // Not a BOM -- seek back to the beginning
if err != nil {
log.Fatal(err)
}
}
// The next read operation on fd will read real data
// ...
}
完成的例子:
package main
import (
"encoding/csv"
"io"
"log"
"monorepo/service/autotable/common/logger"
"os"
)
func main() {
fileName := "/mnt/result.csv"
// 准备读取文件
fs, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
logger.Log.Errorf("can not open the file, err is: %s", err)
}
defer fs.Close()
bom := make([]byte, 3)
_, err = io.ReadFull(fs, bom[:])
if err != nil {
log.Fatal(err)
}
if bom[0] != 0xef || bom[1] != 0xbb || bom[2] != 0xbf {
_, err = fs.Seek(0, 0) // Not a BOM -- seek back to the beginning
if err != nil {
log.Fatal(err)
}
}
content := make([][]string, 0)
r := csv.NewReader(fs)
//针对大文件,一行一行的读取文件
for {
row, err := r.Read()
if err != nil && err != io.EOF {
logger.Log.Infof("can not read, err is: %s", err)
continue
}
if err == io.EOF {
break
}
content = append(content, row)
}
logger.Log.Infof("len:%s", len(content))
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)