问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

5月20日送给单身狗的礼物-《自己写轮子之CSV轮子》

发布网友 发布时间:2024-09-28 13:33

我来回答

1个回答

热心网友 时间:2024-10-15 22:20

? 个人网站: ?IT知识小屋

? 版权: 本文由【IT学习日记】原创、需要转载请联系博主

? 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

前言

  又是一年虐狗日,身为一名经验丰富的单身狗,虽然不能给读者分配"女朋友",但是也希望给大家费分享一些能够提高效率的轮子,帮助大家抽出更多时间摸鱼。

  上一次通过文章跟读者分享了自己写的轮子《摸鱼轮子》,读者的反馈还不错。趁热打铁,赶紧推出的摸鱼轮子第二版-CSV轮子,希望能够帮助更多人节省开发时间,提高摸鱼效率。

  本篇文章会对《轮子之王》开源项目中集成的轮子进行详解介绍,从功能集成从技术选项再到技术实现,帮助大家更好理解轮子是否适用于自己的业务。

项目地址

  Gitee地址: https://gitee.com/it-learning-diary/it-wheels-king

  Github地址: https://github.com/it-learning-diary/it-wheels-king

CSV轮子

  CSV(Comma Separated Values)逗号分隔值,也可以称为字符分隔符,因为分隔字符也可以不是逗号,以纯文本方式存储表格数据(数字和文本)。

  与excel等文件相比,excel文件中会包含许多格式信息,占用的空间会更大,CSV是以纯文本的方式存储,故体积会更小,适合存放结构化的信息,如数据导出、流量统计等。

集成目的

  在日常的开发工作中,导入导出是非常常见的业务,通常来讲,CSV以纯文本方式存储数据,占用的存储空间比excel更少,同时在window环境下默认是使用excel方式打开CSV文件的,因为它本质上是一个文本文件,因此CSV文件的导入导出功能非常常用,故特意在轮子之王项目中集成CSV轮子。

技术架构选择

  JAVA语言中,操作CSV文件相关的框架比较多,常见的有以下几种:

一、Javacsv

  官方地址: https://sourceforge.net/projects/javacsv/

  简介: 它是一个小型的快速开源java库,用于读取和写入CSV和普通分隔文本文件。所有类型的CSV文件都可以处理,txt,Excel格式化,等等。

  特点: 轻量,且快速,但是已经停止维护许久了,不推荐使用。

二、Opencsv

  官方地址: http://opencsv.sourceforge.net/#quick_start

  简介: JAVA中易于使用的CSV解析依赖库,设计出来的目的是因为当时CSV解析器没有商业友好的许可证,最低支持JAVA8。

  特点: 该项目已被Apache基金会收录,可以免费用于商业应用程序中,有较全的官网文档和Apache基金会进行维护,但是最低支持的JAVA版本为8,对一些使用低版本的用户不是很友好。

三、Apache-common-csv

  官方地址: https://commons.apache.org/proper/commons-csv/

  简介: 创建目的是为了在ASL许可证下构架一个通用的、简单的读取和写入CSV的接口,作者希望通过common-csv替换掉之前与csv相关的一些框架如opencsv、skife csv等。

  特点: 被Apache收录,持续维护更新,有较全的官方文档。

四、Univocity-parsers(推荐使用)

  官方地址: https://www.univocity.com/pages/univocity_parsers_tutorial

  简介: JAVA语言编写,号称你能发现的最快的关于CSV文件的JAVA解析器,同时支持固定宽度格式文件和TSV文件,开源、已经被Apache收录了

  特点: 支持CSV、TSV、固定宽度格式文件解析,有完整的官方文档、被Apache收录,持续在更新迭代。

  经过对常用的CSV操作框架对比,考虑到性能、后续拓展性、以及官方文档完整性等方面因素,最终决定使用:Univocity-parser来处理CSV文件。

源码解析

  理论千遍不如实践一遍,下面一起来看看封装的CSV轮子源码吧!

CSV导入轮子

  部分源码如下,详细源请到文章末尾领取:

/** * * @param inputStream * @param errorList * @param rowDto * @param rowAction * @param <T> */public static <T extends Object> void importCsvWithString(InputStream inputStream, List<String> errorList, Class rowDto, ThrowingConsumer<List<String[]>> rowAction) {// 定义bean解析者:用于将csv中数据绑定到实体属性中,然后存储带list集合上RowListProcessor rowListProcessor = new RowListProcessor();CsvParserSettings setting = getDefaultSetting(errorList);setting.setProcessor(rowListProcessor);// 创建csv文件解析CsvParser csvParser = new CsvParser(setting);csvParser.parse(inputStream);// 获取数据映射后的集合List<String[]> rowDataList = rowListProcessor.getRows();// 执行数据持久化persistentStringDataToDb(rowDataList, rowAction);}/** * 将数据持久化到数据库中 * 具体数据落库的业务逻辑方法:此处的逻辑是将数据从csv中读取出来后,然后进行自己的业务处理,最后进行落库操作 * 不懂的可以参考:UserServiceImpl下的uploadUserListWithCsv方法案例 * * @param data * @param persistentActionMethod */private static <T> void persistentStringDataToDb(List<String[]> data, ThrowingConsumer<List<String[]>> persistentActionMethod) {// 对数据分组,批量插入List<List<String[]>> dataList = ListUtil.split(data, ImportConstant.MAX_INSERT_COUNT);dataList.stream().forEach(persistentActionMethod);}CSV导出轮子

&emsp;&emsp;部分源码如下,详细源请到文章末尾领取:

/** * 导出csv文件(表头和数据都以字符串的形式) * * @param response * @param head * @param rowDataList */public static <T> void exportCsvWithString(HttpServletResponse response, String fileName, List<T> head, List<List<T>> rowDataList) {CsvWriter writer = null;try {response.setContentType(ExportConstant.EXCEL_CONTENT_TYPE);response.setCharacterEncoding(ExportConstant.UTF_8);response.setHeader(ExportConstant.CONTENT_DISPOSITION, ExportConstant.ATTACHMENT_FILENAME + fileName + ExportConstant.CSV_SUFFIX);CsvWriterSettings setting = getDefaultWriteSetting();writer = new CsvWriter(response.getOutputStream(), setting);writer.writeHeaders(head);writer.writeStringRows(rowDataList);writer.flush();} catch (Exception e) {log.error("CsvExportUtil exportCsv in error:{}", e);} finally {if (Objects.nonNull(writer)) {writer.close();}}}/** * 导出csv文件(表头和行都以实体的方式) * * @param response * @param head * @param rowDataList */public static <T> void exportCsvWithBean(HttpServletResponse response, String fileName, T head, List<T> rowDataList) {CsvWriter writer = null;try {// 设置响应头格式response.setContentType(ExportConstant.EXCEL_CONTENT_TYPE);response.setCharacterEncoding(ExportConstant.UTF_8);response.setHeader(ExportConstant.CONTENT_DISPOSITION, ExportConstant.ATTACHMENT_FILENAME + fileName + ExportConstant.CSV_SUFFIX);// 设置导出格式CsvWriterSettings setting = getDefaultWriteSetting();// 创见bean处理器,用于处理写入数据BeanWriterProcessor<?> beanWriter = new BeanWriterProcessor<>(head.getClass());setting.setRowWriterProcessor(beanWriter);// 导出数据writer = new CsvWriter(response.getOutputStream(), setting);writer.processRecords(rowDataList);writer.flush();} catch (Exception e) {log.error("CsvExportUtil exportCsvWithBean in error:{}", e);} finally {if (Objects.nonNull(writer)) {writer.close();}}}原文:https://juejin.cn/post/7099613370248069134下一迭代

&emsp;&emsp;下一迭代预计添加如下功能:

PDF轮子

FTP上传下载轮子

更多功能期待读者提出issue或者私信

写在最后

&emsp;&emsp;5月20号这天 ,希望博主的分享能够给你带来一些帮助 ,更多轮子功能集成,欢迎到下面地址了解,如果对您有帮助,希望能收到您的点赞、关注、收藏哦!节日快乐,祝各位单身狗早日遇到良人。

&emsp;&emsp;Gitee地址: https://gitee.com/it-learning-diary/it-wheels-king

&emsp;&emsp;Github地址: https://github.com/it-learning-diary/it-wheels-king

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2023年春节回家能顺风车拉人吗-过年回家顺风车拉人合法吗 有哪部评书和三侠剑评书连着呢。 我们浏览一次网页网站能够从中获得多少流量?比如说百度是怎么赚钱的... 两匹的空调开一小时多少度电 我的症状属于阴虚还是阳虚?这个季节应该怎么调理进补? 大场镇沿革 类似落花时节又逢君的小说类似落花时节又逢君的小说推荐 求类似夫君猛如虎的仙侠穿越小说 ...我们应该树立怎样正确的远大理想和人生规划 ...上好用的mac解压缩软件?betterzip好用点?还是keka好用?哪里有下载呢... 读了&amp;amp;lt;&amp;amp;lt;被骗&amp;amp;gt;&amp;amp;gt;,有什么感悟 &amp;amp;lt;&amp;amp;lt;母亲,谢谢您对我的爱&amp;gt;&amp;amp;gt;350字五年级作 ... &amp;amp;lt;C-j&amp;amp;gt;什么意思 蓝石莲怎么养爆盆 蓝石莲养殖方法与注意事项 ...漂亮身材也好个头中等性格又活泼开朗的女孩子,她来上班没几天就盯 ... 我是一个女孩子,我性格比较开朗,爱开玩笑,和异性的朋友们,姐妹们都要... BIGBANG要是当兵的话,当几年啊? bigbang2022年会回归吗 ...单位实行集中统一领导的国家工作部门和有关单位的领导 抖音里的视频如何保存到手机里 闲鱼买到的东西是假的,怎么维权? 闲鱼上买到假货可以退款吗? 客服人员被投诉会得到什么处罚 客服外呼中投诉怎么写错误认知 我2014年7月份在苏宁电器买个手机,当初是有个活动,买手机后给个电信卡... iphone12王者掉帧严重 手胳膊粗怎么减 大手臂粗怎么减肥 雅阁、帕萨特、凯美瑞、迈腾哪款车更好?复制别人的请不要回答了_百度知... 67,54,46,35,29,() A.13 B.15 C.18 D.20 规律填空题67.54.46.35.29(20)请问规律是什么? 六十七五十四四十六三十五二十九后面应该是多少 67,54,46,35,29的排列规律,后面一个数填几? 找规律六十七五十四四十六三十五二十九接下来一个数应该是多�_百度... 男友告诉我他有痛风,我不想和他结婚了应该怎么拒绝他 被猫抓伤两个脚的小腿,昨天看了医院消毒了左腿打了两针疫苗,今天发觉我... 我的男朋友告诉我他得了痛风,我不想和他在一起可以吗 ...抓伤消毒了左腿小腿没消毒右腿小腿,打了两针疫苗,感觉身体很弱无力没... 我被猫抓伤了,抓了1厘米的伤口,出了血,用肥罩洗了,也抹了碘酒,要不要... 我男友得了痛风,不想和他结婚应该怎么拒绝他呢,才让开心呢 被小猫抓伤了。去到医院医生说要打狂犬病疫苗,哎呀总共要打四针。第... ...打过疫苗了,平时猫都关在家不出去,需要去打疫苗... 我有想象不到的能量的作文 400字 小学四年级作文400字:梦幻世界——魔法(二) 如何从地铁一号线去北京电视台? 这个是runningman哪一期?? ...两天怎么不显示单图文消息和多图文消息,消息怎么才能发出去。_百度... 钢结构阁楼多少一平米 坐过实名制火车,咋还不能添加为12306常用联系人