项目地址

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

JSON格式输出

Markdown的表格输出

直接上代码

代码解析

先看看是怎么读取数据的

写入数据

总结

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

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

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

接下来我们会写不同语言的100行代码的项目,通过这种项目实战的方式,帮助大家更好的学习编程

项目地址

代码已经开源, excel_to_json 👏 Star

代码运行效果:

excel_to_json

通过这个项目,我们可以学习到如何使用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就会变成: json

Markdown的表格输出

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

直接上代码

code

代码解析

读取.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来释放资源,这样就不用担心资源泄漏的问题

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

入群学习

友情链接:

Copyright© 2024 Ruzhila.cn 版权所有