解決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

如若內容造成侵權/違法違規/事實不符,請聯系我的編程經驗分享網進行投訴反饋,一經查實,立即刪除!


相關文章:

  • C#,碼海拾貝(33)——約化“一般實矩陣”為“赫申伯格矩陣”的“初等相似變換法”之C#源代碼,《C#數值計算算法編程》源代碼升級改進版
  • ASP.NET+SQL Sever2005 C語言教學網站及網上考試系統的設計與實現(論文+源代碼+開題報告)
  • 【owt】WebrtcNode, subscribe流程
  • 前端045_單點登錄SSO_實現流程
  • Java對象的共享
  • 【ARMv8 SIMD和浮點指令編程】NEON 減法指令——減法也好幾種
  • Jenkins概念及安裝配置教程(四)
  • Java 實現在順序表指定位置插入一個元素
  • 你知道什么是C++的信號處理嘛?不妨來看看這篇
  • PyTorch深度學習實戰(2)——PyTorch基礎
  • Rust每日一練(Leetday0020) 最后單詞的長度、螺旋矩陣II、排列序列
  • Linux之理解文件系統——文件的管理
  • JavaScript之BOM(八)
  • 阿里云 Windows Server 2022 安裝 Docker
  • 論文筆記--Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
  • Golang每日一練(leetDay0086) 回文鏈表、刪除鏈表節點
  • 衡量距離的公式
  • JSP+ACCESS網上拍賣平臺系統(源代碼+論文)
  • MMPose(openmmlab AI實戰營二期第一節)
  • Leetcode 312. 戳氣球(記憶化搜索)
  • 軟件外包開發的測試用例
  • 數據庫關系操作集合
  • oracle數據文件恢復步驟
  • 什么是webservices?為啥現在還未被淘汰?
  • Anolis OS8 磁盤擴容
  • JVM那些事 (含經典面試題)
  • 《商用密碼應用與安全性評估》第四章密碼應用安全性評估實施要點4.5密碼應用安全性評估測評工具
  • 2023/06/03 軟件PM入門學習(二)
  • Linux賬號管理與ACL權限設定(一)
  • 【內網穿透】Linux本地搭建GitLab服務器
  • 【操作系統】Linux 中的 Page Cache
  • Python 與 MySQL 進行增刪改查的操作以及防止SQL注入
  • MATLAB算法實戰應用案例精講-【數模應用】KMP字符串匹配(附C語言和Java代碼)
  • C語言,指針詳解
  • 第一次使用Arduino IDE(mac os) 配置合宙ESP32C3(9.9包郵)且燒錄代碼的歷程
  • ASP.NET+ACCES視頻點播系統設計(源代碼+論文)
  • web服務器有哪幾種
  • 【實踐經驗】Latex 表格列間距調整
  • TextBlob怎么用的?有哪些具體使用場景呢?
  • Spring Boot 如何保證接口安全?有哪些常用的接口安全技術?
  • 多變量系統的最小二乘辨識問題的推導以及matlab仿真
  • XSS筆記(簡單了解的)
  • 【Leetcode -817.鏈表組件 -1019.鏈表中的下一個更大節點】
  • Sublime Text 便攜版 配置右鍵打開選項
  • 2. requests.get()函數訪問網頁(小白入門)
  • 微信小程序個人心得
  • 【Linux系統基礎快速入門詳解】Linux關機重啟注銷命令原理介紹、以及案例分析
  • 線程任務的取消
  • 【編譯、鏈接、裝載三】編譯器——語法分析、詞法分析、語義分析、編譯器后端
  • 計算機網絡|第五章:網絡層:控制平面