楔子
根據(jù)需求做一個(gè)csv報(bào)表數(shù)據(jù)導(dǎo)入入庫(kù)功能,運(yùn)行多天突然運(yùn)維告知導(dǎo)入數(shù)據(jù)有問(wèn)題,有問(wèn)題那就排查唄。。。
題外話:這個(gè)問(wèn)題足足浪費(fèi)了我2天時(shí)間,為此記錄在這,希望不要在采坑了?。?!
正文
說(shuō)在前面,這個(gè)csv表格數(shù)據(jù)是有中文的,ok繼續(xù)
通過(guò)日志打點(diǎn)發(fā)現(xiàn)了以下錯(cuò)誤
parse error on line 1, column 1: bare " in non-quoted-field
找了一圈,著實(shí)頭痛,我也知道中文需要做處理轉(zhuǎn)化這個(gè)我已經(jīng)做了,并且已經(jīng)明確是utf-8了通過(guò)標(biāo)準(zhǔn)庫(kù)方法進(jìn)行判斷的還是報(bào)錯(cuò)。著實(shí)讓我摸不著頭腦。另判斷utf-8方法如下
import????(
????"unicode/utf8"
)
if utf8.Valid(readData){
????fmt.Println("is utf-8")
}
ok,最后借助了百度,google找了一大圈功夫不負(fù)有心人,最后發(fā)現(xiàn)utf-8還有utf-8 bom這種編碼格式,我想罵娘。。。至于編碼規(guī)則啥的就不詳細(xì)說(shuō)了,有興趣自行搜索吧。
解決方案如下:
import(
? ? "encoding/csv"
????"golang.org/x/text/encoding/simplifiedchinese"
????"golang.org/x/text/transform"
)
// 方式一
read := csv.NewReader(bytes.NewReader(raw))
read.LazyQuotes = true
// todo some thing// 方式二 (此方法會(huì)把utf-8中的bom前綴去除掉,即使文件內(nèi)容是utf-8編碼不帶bom也不會(huì)報(bào)錯(cuò),也是可以的)
read := csv.NewReader(transform.NewReader(bytes.NewReader(raw), unicode.UTF8BOM.NewDecoder()))
// todo some thing
至于其他編碼方式以及轉(zhuǎn)換可以查看golang官方擴(kuò)展庫(kù) golang.org/x/text/encoding 庫(kù)中的源碼。
參考
https://stackoverflow.com/questions/31326659/golang-csv-error-bare-in-non-quoted-field
https://github.com/golang/go/issues/21672
https://zasy.github.io/2018/09/28/tx-06/
一個(gè)用golang的牛馬
完~