100行Go代码实现Excel/CSV转JSON和Markdown表格

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。

我们通过这个项目学习了如何读取excel和csv文件,如何序列化json和生成markdown表格,这些都是非常实用的技能,希望大家可以通过这个项目学到更多的知识。

接下来我们会写不同语言的100行代码的项目,通过这种项目实战的方式,帮助大家更好的学习编程,对项目感兴趣的同学可以加我们的项目实战交流群
入群学习

项目地址

代码已经开源, excel_to_json 👏 Star

代码运行效果:
在这里插入图片描述

通过这个项目,我们可以学习到如何使用Go语言的文件操作,Excel文件的读取,CSV文件的读取,JSON的序列化和反序列化,学习stingsfilepath等常见的库的使用

如何实现Excel/CSV转JSON和Markdown表格

我们设计了一个简单的需求,输入2个参数,第一个参数可以是.xlsx.csv, 第二个参数是输出的文件名,根据输出的文件的后缀,输出对应的文件格式,支持jsonmarkdown, 对应就是.json.md文件

JSON格式输出

我们知道excel和csv是标准的表格,所以我们可以把表格的每一行当做一个json对象,表格的第一行当做json的key
比如:

name,age
lucy,18
bob,20

那么输出json就会变成:
在这里插入图片描述

Markdown的表格输出

我们知道markdown的表格是通过|来分割的,只需要把表格的每一行的数据用|分割,然后在第一行和第二行加上|就可以了

直接上代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码解析

读取.xlsx我们采用了excelize库, 这个是最先进的golang操作excel的库,而且还是国人开发的,非常好用和强大。

先看看是怎么读取数据的

  • 29-80行:读取csv或者excel文件,把每一行的数据存储到Record数组中
    • 35行:是golang的defer指令,就是当函数结束的时候,会执行这个指令,相当于C++的析构函数,只不过变成了一行析构代码,这样可以确保我们打开的文件会被关闭
  • 39-57行:利用encoding/csv这个标准库读csv文件
    • 40行:读取第一行,这个是csv的头部,我们把这个头部当做json的key
    • 45行:是一个循环读取,在47-51行如果出现读取失败,就离开循环
    • 54行:也是go的一个特有的for .. := range 语法,这个语法可以遍历一个数组,第一个参数是索引,第二个参数是值
  • 60-75行:利用excelize读取excel文件
    • 60行:传入了第31行打开的文件对象
    • 64行:读取所有的行,将所有的行存储到Record数组中

写入数据

在写入数据之前,我们要先判断输出文件的扩展名,就必须用到filepath这个库,这个库可以帮助我们解析文件的路径,获取文件的扩展名:

  • 14-15行,输出是json格式,只需要把Record数组序列化成json格式,然后写入文件就可以了, 为了方便阅读,我们采用的是MarshalIndent这个函数,这个函数可以把json格式化输出
  • 17行,输出是markdown格式,就调用buildMarkdown这个函数,这个函数会把Record数组转换成markdown格式的表格
  • json和markdown都是生成[]byte的buff, 方便接下来写入到文件中
  • 81-98行:将Record数组转化成markdown格式的表格
    • 82行:我们采用了strings这个库,比较复杂的字符串操作都建议采用strings这个库,这个库的性能非常好,也很方便
    • 88行:调用了strings.Join这个拼接函数
    • 89行:调用了strings.Repeat这个重复函数,这个函数可以把一个字符串重复多次
    • 98行:将最后的结果输出到[]byte的buff中
  • 23行:如果markdown和json的格式化输出都没问题,就直接调用os.WriteFile将buff写入文件

总结

Go是一个非常适合做后端开发的语言,标准库非常丰富,而且性能非常好, 特别常用的标准库是大家日常工作都需要用到的:

  • filepath 用来处理文件路径相关,比如获取文件的扩展名和目录、处理相对路径等工作,这样跨平台的时候就不用担心路径的问题
  • strings 用来处理字符串相关的操作,比如拼接、分割、替换等,这个库的性能非常好,而且功能非常强大
  • defer可以方便的处理资源的释放,比如打开文件,打开数据库连接等,都可以用defer来释放资源,这样就不用担心资源泄漏的问题

如果大家对后端编程有兴趣,可以关注入职啦,我们会定期更新后端编程的实战教程。

对项目感兴趣的同学,可以加入我们的100行实战项目群,大家可以在群里交流实战项目
入群学习
有想要实现的项目和使用的语言,可以在评论区留言,我们会尽量安排,可以选择的语言:
Java, rust, go, js, python

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值