楔子
根據(jù)需求做一個(gè)csv報(bào)表數(shù)據(jù)導(dǎo)入入庫功能,運(yùn)行多天突然運(yùn)維告知導(dǎo)入數(shù)據(jù)有問題殷费,有問題那就排查唄。眉枕。。
題外話:這個(gè)問題足足浪費(fèi)了我2天時(shí)間怜森,期間還出了其他的一些問題著實(shí)讓我抓狂速挑,另外這篇文章希望能幫到你,不要在采坑了8惫琛@驯Α!
正文
說在前面恐疲,這個(gè)csv表格數(shù)據(jù)是有中文的腊满,ok繼續(xù)
通過日志打點(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了通過標(biāo)準(zhǔn)庫方法進(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ì)說了箩兽,有興趣自行搜索吧。
解決方案如下:
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ò)展庫 golang.org/x/text/encoding 庫中的源碼汗贫。
參考
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的專科生
完~