Java实现从本地读取CSV文件数据

一、前言
最近项目中需要实现这样一个功能,就是从本地读取CSV文件,并以指定行作为标题行,指定行开始作为数据读取行,读取数据并返回给前端,下面具体说下是如何通过java实现。

二、如何实现?
1.引入相关maven依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>
</dependency>

2.定义一个工具类CsvUtils。

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import cn.hutool.core.text.csv.CsvUtil;import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CsvUtils {public static final String FIELD_NAME="column";public static List<Map<String, Object>> getCsvFileContent(InputStream in, Long readLine, int headerRowIndex, int readCount,String splitChar) throws IOException {InputStreamReader is = null;CsvReader reader =null;InputStream bufferedInputStreamOne =null;InputStream bufferedInputStreamTwo =null;ByteArrayOutputStream baos =null;try {if (in == null) {throw new FileStorageRuntimeException("文件读取失败,文件不存在!");}if (readLine ==null){readLine =2l;}List<Map<String, Object>> resList = new ArrayList<>();reader = CsvUtil.getReader();baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024*10];int len;while ((len = in.read(buffer)) > -1 ) {baos.write(buffer, 0, len);}baos.flush();bufferedInputStreamOne=new ByteArrayInputStream(baos.toByteArray());bufferedInputStreamTwo=new ByteArrayInputStream(baos.toByteArray());boolean isUtf8=checkUTF8(bufferedInputStreamOne);//从文件中读取CSV数据is = new InputStreamReader(bufferedInputStreamTwo,Charset.forName(isUtf8 ? "UTF-8":"GBK"));reader.setFieldSeparator(splitChar.charAt(0));reader.setSkipEmptyRows(false);CsvData data = reader.read(is);List<CsvRow> rows = data.getRows();//空表格;if (rows.isEmpty()) {return null;}List<String> headRowList =new ArrayList<>();if (headerRowIndex > 0 && rows.size()>headerRowIndex - 1){//获取表头;headRowList = rows.get(headerRowIndex - 1).getRawList();}else {if (CollectionUtil.isNotEmpty(rows)){List<String> rowList=rows.get(0).getRawList();for(int i=1;i<=rowList.size();i++) {headRowList.add(FIELD_NAME+i);}}}List<String> headList=new ArrayList<>();for (int i=0;i<headRowList.size();i++) {String fieldName = headRowList.get(i);if (StrUtil.isBlank(fieldName )) {headList.add(FIELD_NAME+(i+1));}else {headList.add(fieldName);}}if (CollUtil.isNotEmpty(rows)){CsvRow currCsvRow = rows.get(0);if (headList.size() != currCsvRow.getRawList().size()) {throw new FileStorageRuntimeException("列数量与数据数量不一致");}}if (readLine>1) {//加上一行List<String> addRawListNew = headRowList.stream().map(s -> StrUtil.trim(s)).collect(Collectors.toList());Map map = IterUtil.toMap(headList, (Iterable) addRawListNew,true);resList.add(map);}//遍历行for (int i = (int)((long)readLine)-1; i < rows.size(); i++) {CsvRow csvRow = rows.get(i);//getRawList返回一个List列表,列表的每一项为CSV中的一个单元格(既逗号分隔部分)List<String> rawList = csvRow.getRawList();List<String> rawListNew = rawList.stream().map(s -> StrUtil.trim(s)).collect(Collectors.toList());Map map = IterUtil.toMap(headList, (Iterable) rawListNew,true);resList.add(map);if(readCount>=0 && i>=readCount){break;}}return resList;} catch (Exception e) {e.printStackTrace();throw new RuntimeException("get inputStreamReader failed");} finally {if (in!=null){in.close();}if (is!=null){is.close();}if (reader!=null){reader.close();}if(bufferedInputStreamTwo !=null){bufferedInputStreamTwo.close();}if(bufferedInputStreamOne !=null){bufferedInputStreamOne.close();}if (baos!=null){baos.close();}}}/*** 判断文件内容是否为 UTF-8 编码* @author*/public static boolean checkUTF8(InputStream fis) {//请注意fis是流,是不能复用的!try {while (true) {int curr = fis.read();if (curr == -1) {return true;}if (curr < 0x80) {// (10000000): 值小于0x80的为ASCII字符} else if (curr < (0xC0)) { // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符return false;} else if (curr < (0xE0)) { // (11100000): 此范围内为2字节UTF-8字符if ((fis.read() & (0xC0)) != 0x80) {return false;}return true;} else if (curr < (0xF0)) { // (11110000): 此范围内为3字节UTF-8字符if ((fis.read() & (0xC0)) != 0x80 || (fis.read() & (0xC0)) != 0x80) {return false;}return true;} else {return false;}}} catch (IOException e) {return true;}}}

接着通过main方法调用下。

   public static void main(String[] args) throws IOException {FileInputStream inputStream = new FileInputStream(new File("D:\\111.csv"));List<Map<String, Object>> list=getCsvFileContent(inputStream,2l,1,50,",");System.err.println(list);}

结果如下:
在这里插入图片描述
其中readCount表示返回的数据数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习笔记】6_7 门控循环单元(GRU)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.7 门控循环单元&#xff08;GRU&#xff09; 上一节介绍了循环神经网络中的梯度计算方法。我们发现&#xff0c;当时间步数较大或者…

【Objective -- C】—— 自引用计数

【Objective -- C】—— 自引用计数 一. 内存管理/自引用计数1.自引用计数2.内存管理的思考方式自己生成的对象&#xff0c;自己持有非自己生成的对象&#xff0c;自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象 3.alloc/retain/release/dealloc实现4. aut…

全链路Python环境迁移

全链路Python环境迁移 在当前的Python环境中&#xff0c;安装一些库以后&#xff0c;如果换了一套Python环境&#xff0c;难道再来一次不停的pip install&#xff1f;当然不是。 第一步&#xff0c;使用pip freeze&#xff08;冻结&#xff09;备份当前Python库的环境 pip f…

智慧公厕系统的运作过程

智慧公厕是一种新型的未来城市公共厕所&#xff0c;通过物联网、互联网、大数据、云计算、自动化控制等技术&#xff0c;实现公共厕所使用、运营、管理、养护的全过程全方位信息化。 那么&#xff0c;智慧公厕是如何运作的&#xff1f;智慧公厕的运作过程包括什么技术&#xf…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据&#xff0c;数据来源于2017年的《中国统计年鉴》&#xf…

Publii和GitHub:搭建个人网站的完美组合

在数字时代&#xff0c;拥有一个个人网站已经非常普遍了&#xff0c;但是&#xff0c;很多人因为技术难题而望而却步。现在&#xff0c;有了Publii&#xff0c;这一切都将变得简单。Publii是一个静态网站生成器&#xff0c;它允许你在本地计算机上创建和管理内容&#xff0c;然…

ARM中汇编语言的学习(加法、乘法、除法、左移、右移、按位与等多种命令操作实例以及ARM的 N、Z、C、V 标志位的解释)

汇编概述 汇编需要学习的大致框架如下&#xff1a; 汇编中的符号 1.指令&#xff1b;能够北嘁肷梢惶?2bit机器码&#xff0c;并且能够被cpui识别和执行 2.伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令 3.伪操作&#xff1a;不会生成指令…

如何修复advapi32.dll丢失无法启动程序的问题

如果你在运行Windows程序时遇到了“advapi32.dll丢失无法启动程序”的错误消息&#xff0c;那么这意味着你的计算机缺少这个DLL文件。在本文中&#xff0c;我们将提供一些解决方案&#xff0c;帮助你解决这个问题并恢复计算机的正常运行。 一.advapi32.dll丢失电脑的提示 关于…

软件项目试运行方案

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体制&…

宏碁掠夺者:4K144Hz显示器,让你爽翻天

大家好&#xff0c;我又来了。 买了PS5后&#xff0c;我发现这样的主机放在客厅里可玩性不太高&#xff08;我没机会玩&#xff09;。 毕竟家里还有今年要上小学的孩子。 每天回家打卡交作业都让我发疯。 客厅里放一台PS5无疑是每天对孩子最大的影响&#xff08;也划破了我的心…

vue 下载的插件从哪里上传?npm发布插件详细记录

文章参考&#xff1a; 参考文章一&#xff1a; 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二&#xff1a; npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…

智能驾驶规划控制理论学习08-自动驾驶控制模块(轨迹跟踪)

目录 一、基于几何的轨迹跟踪方法 1、基本思想 2、纯追踪 3、Stanly Method 二、PID控制器 三、LQR&#xff08;Linear Quadratic Regulator&#xff09; 1、基本思想 2、LQR解法 3、案例学习 基于LQR的路径跟踪 基于LQR的速度跟踪 4、MPC&#xff08;Mode…

day59 线程

创建线程的第二种方式 实现接口Runnable 重写run方法 创建线程的第三种方式 java.util.concurrent下的Callable重写call()方法 java.util.concurrent.FutureTask 创建线程类对象 获取返回值 线程的四种生命周期 线程的优先级1-10 default为5&#xff0c;优先级越高&#xff0c…

基于梯度统计学的渐变型亮缝识别算法

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、场景痛点 在图像处理相关的实际工程中&#xff0c;会出现各式各样的现实复杂问题&#xff0c;有的是因为机械设计导致&#x…

【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 ( X , Y ) (X, Y) (X,Y)&#xff0c;我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。 例如 …

蓝桥杯练习系统(算法训练)ALGO-981 过河马

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后&#xff0c;这匹马表示它不开心了……   于是&#xff0c…

Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者

在往期文章中&#xff0c;我们讲了如何在Windows与Linux环境下安装RabbitMq服务&#xff0c;并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的&#xff0c;它起到一个什么作用&#xff0c;并且如何在常见的SpringBoot项目中集成mq并实现消息收发&#xff0c;本章…

Nginx实现高并发

注&#xff1a;文章是4年前在自己网站上写的&#xff0c;迁移过来了。现在看我之前写的这篇文章&#xff0c;描述得不是特别详细&#xff0c;但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的&#xff0c;可以在网上找找其他的文章。 ......................…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…