本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。
我们通过这个项目学习了如何读取excel和csv文件,如何序列化json和生成markdown表格,这些都是非常实用的技能,希望大家可以通过这个项目学到更多的知识。
接下来我们会写不同语言的100行代码的项目,通过这种项目实战的方式,帮助大家更好的学习编程,对项目感兴趣的同学可以加我们的项目实战交流群
项目地址
代码已经开源, excel_to_json 👏 Star
代码运行效果:
通过这个项目,我们可以学习到如何使用Go
语言的文件操作,Excel
文件的读取,CSV
文件的读取,JSON
的序列化和反序列化,学习stings
、filepath
等常见的库的使用
如何实现Excel/CSV转JSON和Markdown表格
我们设计了一个简单的需求,输入2个参数,第一个参数可以是.xlsx
和.csv
, 第二个参数是输出的文件名,根据输出的文件的后缀,输出对应的文件格式,支持json
和markdown
, 对应就是.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++的析构函数,只不过变成了一行析构代码,这样可以确保我们打开的文件会被关闭
- 35行:是golang的
- 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中
- 82行:我们采用了
- 23行:如果markdown和json的格式化输出都没问题,就直接调用
os.WriteFile
将buff写入文件
总结
Go是一个非常适合做后端开发的语言,标准库非常丰富,而且性能非常好, 特别常用的标准库是大家日常工作都需要用到的:
filepath
用来处理文件路径相关,比如获取文件的扩展名和目录、处理相对路径等工作,这样跨平台的时候就不用担心路径的问题strings
用来处理字符串相关的操作,比如拼接、分割、替换等,这个库的性能非常好,而且功能非常强大defer
可以方便的处理资源的释放,比如打开文件,打开数据库连接等,都可以用defer
来释放资源,这样就不用担心资源泄漏的问题
如果大家对后端编程有兴趣,可以关注入职啦,我们会定期更新后端编程的实战教程。
对项目感兴趣的同学,可以加入我们的100行实战项目群,大家可以在群里交流实战项目
有想要实现的项目和使用的语言,可以在评论区留言,我们会尽量安排,可以选择的语言:
Java, rust, go, js, python