解決record on line 2: wrong number of fields
背景
?
基于"encoding/csv"庫解析。
共解析多個文檔,只有這一個解析有問題,所用代碼一致,進行比較后
發現該文檔和其它文檔不同,其它文檔是第一行就是列名,下面都是數據;
而這個文檔前兩行有數據且分別僅占用了1列、2列,接下來幾行為空,到第6
行才是每一列數據的列名,第7行為空,第8行開始往后才是真正數據。
文檔看起來有點“特殊”。
解析代碼
?? ?bs, err := ioutil.ReadFile("路徑")if err != nil {return nil, err}r := csv.NewReader(strings.NewReader(string(bs)))var records [][]stringrecords, err = r.ReadAll()if err != nil { ? ?// record on line 2: wrong number of fieldsreturn nil, err}
其實代碼并無什么問題,但正是由于records, err = r.ReadAll()這一行解析這個“特殊”的文檔時報錯了。
難道對于這種不規則的文檔、這個庫就解析不了了嗎?有的童鞋已經開始選別的庫了,先別急,我們分析一下。
分析
第一,從報錯入手。
看看文檔中第二行是不是有錯誤的數據內容?第二行第一列是漢字,第二行第2列是日期,看起來是一堆的#號。
有什么問題嗎? 當然沒有,每個單元格的內容理論上你想寫什么都可以的。
第二,那我們看看代碼。
上面是通過ReadAll一次性拿到內容的,平時讀取文件不也可以按行嗎,又不是必須一次拿到,那就按行試試。??
?bs, err := ioutil.ReadFile("路徑") ?// 這一步正常,暫不理if err != nil {return nil, err}r := csv.NewReader(strings.NewReader(string(bs)))for line := 1; ; line++ {var record []stringrecord, err = r.Read() // 驗證發現空行會自動跳過if err == io.EOF { ?// 到結尾就結束break}// 到這里先不要判斷err是不是有錯,先打印本行數據看看是不是和文檔內容一致fmt.Println("line ", line, " record:", record)?// 由于第6行才到列名,前面5行內容我們不需要,可以專門控制if line < 5 {if err != nil { ? // 看看前面五行是什么妖魔鬼怪fmt.Println("前5行出現報錯:", err)err = nil}continue ?}// 是正常數據,就放到records中if len(record) > 0 {records = append(records, record)continue}// 最后再看是不是出錯了,有問題這行就先不管
// 讓continue繼續看后面的數據有無類似問題,如果沒有那就是本行的問題if err != nil {fmt.Println("line ", line, " 報錯:", err)continue}}
這樣得到的結果完美,其中的報錯并對正常結果無影響。而如果把最后一個if err != nil
放在if line < 5的前面,你就會發現不停的在報錯:
record on line 2: wrong number of fields
record on line 4: wrong number of fields
record on line 6: wrong number of fields
record on line 8: wrong number of fields
record on line 9: wrong number of fields
record on line 10: wrong number of fields
record on line 11: wrong number of fields
...
無窮匱也。如圖:
同時record那行打印也一直在打印正常數據。
每行都錯,錯在誰?
第8行開始是正常數據,而從第8行開始每行都有這個報錯,難道是文檔問題嗎,肯定不是了。
所以綜合來看,按如上處理即可達到正常效果,有些錯誤你看看就行。
本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處:https://dhexx.cn/hk/4628064.html
如若內容造成侵權/違法違規/事實不符,請聯系我的編程經驗分享網進行投訴反饋,一經查實,立即刪除!