解决record on line 2: wrong number of fields

news/2024/11/24 12:36:28/


背景

 

基于"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行开始每行都有这个报错,难道是文档问题吗,肯定不是了。

所以综合来看,按如上处理即可达到正常效果,有些错误你看看就行。


http://www.ppmy.cn/news/201001.html

相关文章

Linux之理解文件系统——文件的管理

文章目录 前言一、磁盘1.磁盘的物理结构2.磁盘的存储结构3.磁盘的逻辑结构 二、文件系统与inode1.文件在磁盘中是如何存储的&#xff1f;2.对文件进行操作 三、软硬链接1.软链接创建软链接&#xff1a;inode删除软链接&#xff1a;软链接的作用&#xff1a; 2.硬链接创建硬链接…

hp服务器修改风扇转速,如何改变惠普笔记本风扇转速

满意答案 sidm6926 2014.06.11 采纳率&#xff1a;56% 等级&#xff1a;11 已帮助&#xff1a;1174人 您好&#xff0c;感谢您选择惠普产品。 一、您这款机器没有好的方法可以调节机器风扇的转数的。 二、HP电脑一般采用小型高效的风扇进行散热&#xff1b;在机器在使用一段…

hp移动工作站 linux,戴尔推出三款Precision移动工作站产品 采用Ubuntu Linux操作系统...

访问购买页面: 它采用Intel Xeon E或第9代Intel Core处理器&#xff0c;最多8个内核&#xff0c;高达64GB内存&#xff0c;高达4TB的存储空间以及专业级Nvidia Quadro T2000显卡&#xff0c;配备4GB显存。 Dell Precision 7540移动工作站能够承受繁重的工作流程&#xff0c;配备…

Anolis OS8 磁盘扩容

最近学习的时候&#xff0c;使用Vmware安装了AnolisOS8进行测试&#xff0c;随着学习的深入&#xff0c;组件安装越来越多&#xff0c;磁盘不够用了&#xff0c;但是安装的组件又太多&#xff0c;重新装个虚拟机又得重新装各种组件。所以决定对磁盘进行扩容&#xff0c;在这里做…

python中如何移动图形工作站_如何评价ThinkPad的新款移动工作站P53?

再再次更新 渲染死机了两次 注册了联保 打算还是去检修一下 自己有aida64检测 开渲染cpu会降频 但是我台式机不会 台式机价格和笔记本差不多 所以以后能台式还是台式吧... 再次更新 t2000显卡跑lumion不够看 不如游戏卡lumion这种还真是需要游戏卡 因为跑lumion死机了两次... 更…

20台工作站的计算机局域网络,服务器、工作站与普通电脑有什么区别?

[来自IT168]  对于大多数消费者来说&#xff0c;我们购买或者使用电脑&#xff0c;都知道有台式机、商务本、游戏本之分&#xff0c;但是偶尔还看见过有工作站&#xff0c;而在企业工作的员工还知道有服务器。  从本质上来讲&#xff0c;不管是台式机还是笔记本、游戏本&am…

Z600服务器是阵列硬盘,hp z600 工作站 sata硬盘ahci配置raid方法

hp z600 工作站 sata硬盘ahci配置raid方法 (22页) 本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01; 19.90 积分 HP Z600 工作站 SATA 硬盘 AHCI 配置 RAID 方法接通电源开机 POST 界面结束后会出现 RA…

gen9 ws460c 惠普_超越界限,定义未来-- HP刀片工作站WS460c Gen9无惧4K挑战

现如今,媒体行业已经进入了数字化的时代&#xff0c;从视频采集、后期制作、成品交付以及数据制作,缺一不可。海量级的视频剪辑资料要依赖强大的硬件平台进行编辑处理&#xff0c;因此&#xff0c;拥有一部性能卓越、高效率且安全可靠的硬件产品&#xff0c;在影视制作中能够起…