文章目录

  • 一、前言
  • 二、实现
    • 1. 首先进行CSV文件读取,并且把文件组成list,把list拆分
    • 2. 拆分的具体代码如下:
    • 3. 导出到新CSV文件代码如下:
    • 4.测试
    • 5. 结果

一、前言

前段时间有个需求,因为一个CSV文件太大了,程序跑不了,需要把一个CSV文件转成任意多个CSV文件,同时把文件的头也要带上。

二、实现

1. 首先进行CSV文件读取,并且把文件组成list,把list拆分

 /*** 读取并拆分文件** @param originalFileName 原始文件的名字 eg:  data.scv* @param len              每个文件包含的记录数  eg:  10000* @return*/public static List<String> readAndSplitFile(String originalFileName,String newFilePath, int len) throws IOException {long startTime = System.currentTimeMillis();    //获取开始时间//1.读取CSV文件数据BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(originalFileName), "UTF-8"));String line;boolean isTitle = true;String titles = "";List<String> li = new ArrayList<String>();while ((line = br.readLine()) != null) {//读取获取CSV文件行、列数据String[] info = line.split(",");if (isTitle) {titles = line;isTitle = false;
//                li.add(titles);} else {li.add(line);}}List<List<String>> lists = ListUtils.fixedGrouping(li, len);int fileNumber = lists.size();// 存放新生成的文件路径List<String> newFilePathList = new ArrayList<>();for (int i = 0; i < fileNumber; i++) {List<String> list = lists.get(i);list.add(0, titles);String fileName = "";// 生成新文件的路径if (!StringUtils.isEmpty(newFilePath)){File dir = new File(newFilePath);if (!dir.exists()) {// 判断目录是否存在dir.mkdir();}fileName = new StringBuilder(newFilePath).append(i + 1).append(".csv").toString();}else {int index = originalFileName.lastIndexOf("/");newFilePath = originalFileName.substring(0,index+1);fileName = new StringBuilder(newFilePath).append(i + 1).append(".csv").toString();}boolean exportCsv = exportCsv(new File(fileName), list);if (exportCsv && i == fileNumber - 1) {System.out.println("文件--" + (i * len) + "个-" + (list.size() + i * len) + "个" + fileName + "--生成成功!");newFilePathList.add(fileName);} else if (exportCsv && i != fileNumber - 1) {System.out.println("文件--" + (i * len) + "个-" + ((i + 1) * len) + "个" + fileName + "--生成成功!");newFilePathList.add(fileName);} else {System.out.println("文件--" + fileName + "--生成失败!");}}long endTime = System.currentTimeMillis();    //获取结束时间double userTime = ((double) endTime - startTime) / 1000;//执行时长<秒>System.out.println("\n" + String.format("执行完毕,共花时长:%s秒", userTime));//秒return newFilePathList;}

2. 拆分的具体代码如下:

package com.example.industry.test;import java.util.ArrayList;
import java.util.List;/*** 作者:wy* 创建时间:2021/9/22 0022 19:19* 描述:*/
public class ListUtils {/*** 将一组数据固定分组,每组n个元素* @param source 要分组的数据源* @param n      每组n个元素* @param <T>* @return*/public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {if (null == source || source.size() == 0 || n <= 0)return null;List<List<T>> result = new ArrayList<List<T>>();int sourceSize = source.size();int size = (source.size() / n) + 1;for (int i = 0; i < size; i++) {List<T> subset = new ArrayList<T>();for (int j = i * n; j < (i + 1) * n; j++) {if (j < sourceSize) {subset.add(source.get(j));}}result.add(subset);}return result;}
}

3. 导出到新CSV文件代码如下:

 /*** 导出(到CSV文件)** @param file     csv文件(路径+文件名),csv文件不存在会自动创建* @param dataList 数据* @return*/public static boolean exportCsv(File file, List<String> dataList) {boolean isSucess = false;FileOutputStream out = null;OutputStreamWriter osw = null;BufferedWriter bw = null;try {out = new FileOutputStream(file);osw = new OutputStreamWriter(out, "UTF-8");//设置输出编码方式为UTF-8//加上UTF-8文件的标识字符osw.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));bw = new BufferedWriter(osw);if (dataList != null && !dataList.isEmpty()) {for (String data : dataList) {bw.append(data).append("\r");}}isSucess = true;} catch (Exception e) {isSucess = false;} finally {if (bw != null) {try {bw.close();bw = null;} catch (IOException e) {e.printStackTrace();}}if (osw != null) {try {osw.close();osw = null;} catch (IOException e) {e.printStackTrace();}}if (out != null) {try {out.close();out = null;} catch (IOException e) {e.printStackTrace();}}}return isSucess;}

4.测试

我们把文件拆分成了一万条一个CSV

    public static void main(String[] args) throws IOException {// 第二个参数不指定,会在原始的路径下生成拆分后的文件List<String> result = readAndSplitFile("D:/CSVDir/data.csv","", 10000);System.out.println("------------------默认新生成的文件路径如下:------------");result.stream().forEach(item->{System.out.println(item);});System.out.println("------------------默认新生成的文件路径完毕------------");List<String> result1 = readAndSplitFile("D:/CSVDir/data.csv","D:/CSV/", 10000);System.out.println("------------------指定新生成的文件路径如下:------------");result1.stream().forEach(item->{System.out.println(item);});System.out.println("------------------指定新生成的文件路径完毕------------");}

5. 结果



感谢您的关注!,咱们一起努力相互交流吧

Java如何把一个CSV文件拆分成指定个CSV文件【带源码,完美运行带截图】相关推荐

  1. java将一个大文件拆分成几个小文件输出

    java读取一个大文件写到多个小文件 最近看Java面试中有问到关于利用java io流,读取一个大文件,然后输出到几个小文件的问题,这里自己写了个简单的sample public static vo ...

  2. sqlserver将mdf文件拆分成多个ndf文件

    sqlserver版本:2008R2 1.为什么要拆分 数据库在运行一段时间后mdf文件会迅速增大,这会导致查询速度变慢.或者mdf文件的大小达到了操作系统允许的最大大小,这个时间就必须要进行拆分了. ...

  3. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)...

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中. Excel的多个Sheet对应页面的多个Tab选项卡. 转换算法的难点在于,如何处理行列合并,将E ...

  4. python将大文件拆分成多个小文件,同时对各小文件处理以节省时间

    # test.py import json import osroot_path = os.path.dirname(__file__)def f(x):return xtest_datas = [] ...

  5. 怎么把一个PDF拆分成多个PDF文件?

    中午休息的时候同事问我:怎么把一个PDF拆分成多个PDF文件?PDF拆分很简单啊,办公都要用到PDF文件,想到这儿,小编就分享实用的方法. 1.在百度中去搜索关键词迅捷PDF在线转换器,点击进入在线网 ...

  6. python拆分excel的sheet为单文件_WPS 2019 多个sheet表拆分成独立的excel文件

    参考: 场景:将多个sheet表拆分成独立的excel文件 一.安装VB工具: 默认情况下:wps -- 开发工具 --- VB 编辑器是灰选状态(即不可用状态),此时需要先安装vb工具:VBA Fo ...

  7. 批量将一个 PPT 幻灯片文件按固定页数拆分成多个幻灯片文件

    概要:对于经常写 PPT 的人来说,经常会与 PPT 幻灯片打交道.如果一个 PPT 幻灯片文件有很多页数,那么有没有办法能够将他们拆分成多个 PPT 幻灯片文件呢?这样每一个独立的 PPT 文件的页 ...

  8. 批量将一个或多个 Word 文件按固定页数拆分成多个 Word 文件

    概要:我们经常面对很多 Word 文档,有些 Word 文档有几百页,有时候我们希望将这些 Word 文档都按固定的页数拆分成多个 Word 文档.有没有一种简单的方法能够批量的将这些 Word 文件 ...

  9. PDF拆分成多个页面怎么办?这三个方法让你实现将文件拆分成多页

    PDF是我们常见的文件格式之一,在日常办公中,我们经常会将WORD.PPT.EXCEL等文档转换成PDF的格式后再进行传输,这样不仅传输速度快,格式也不会出现乱码的情况,但在一些特殊的场景下,我们也需 ...

最新文章

  1. Nature出炉「中国博士生图鉴」:过半学生想换领域换导师,40%学生受抑郁、焦虑困扰...
  2. 批处理for中如何实现break
  3. 【Python】又一个可视化神器Highcharts,Python版也有哦!
  4. ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...
  5. 在已经排好序的线性表中插入一个数,还是升序
  6. mysql集群一:主从复制,通过mysql-proxy做负载均衡
  7. Python获取图片的大小/尺寸
  8. OpenGL超级宝典(第7版)环境配置和相关问题
  9. win10cmd重置系统_win10怎么重置电脑 win10重置此电脑的方法【图文】
  10. 【正点原子MP157连载】第十三章 外部中断实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  11. GOM引擎ItemShow代码在NPC对话框中显示装备图片及属性
  12. 手机中CAD图纸发送到电脑上后打不开了怎么办?
  13. Ubuntu下安装VSCODE并输入中文
  14. t1商贸宝服务器信息,商贸宝t1服务器设置
  15. 两年数据对比柱形图_你与专业堆积柱形图的距离,只差一个数据标签
  16. win7绕过开机密码
  17. 手机详情 html代码生成器,dede源码最新版手机移动端静态生成模块插件
  18. 127.0.0.1 拒绝了我们的连接请求(解析格式数据)
  19. 【Matplotlib】(二)图例legend
  20. 自定义firefox背景色(豆绿色)

热门文章

  1. UVM设计模式 ( 二 ) 参数化类、静态变量/方法/类、单例模式、UVM_ROOT、工厂模式、UVM_FACTORY
  2. 技术图文:数字资产量化中的三角套利策略
  3. GDPR从数据主体处收集信息时的信息提供,应包含哪些内容?怎样做才合规?
  4. java显示多个地区时钟_Java实现的动态数字时钟功能示例【显示世界时间】
  5. C++ 构造函数与this指针
  6. AutoMapper总结
  7. Next.js脚手架进阶 — 完美契合ant-design
  8. [日推荐]『小睡眠』今夜助你轻松入眠~
  9. ISO 26262 ASIL安全等级,怎样划分和分解【转】
  10. IEEE Fellow 张大庆:6G 时代, Wi-Fi 不再是 Wi-Fi