时间:2021-05-20
简介
工作的时候,需要将一个大的文本文件按行分割成几个小文件。本来懒得写,想网上copy一下得了,但是 google 了一遍,找了几个代码写的有点乱,尝试了之后发现效率太慢了,一个 1000000 行200M 的文件,按每个文件 2000 行分割,要6分多钟才能跑完。没办法自己写了个,试了几次,基本都是 4 秒内跑完,贴出来记录下,下次用就直接 copy 出来用。
代码
public static List<File> splitDataToSaveFile(int rows, File sourceFile, String targetDirectoryPath) { long startTime = System.currentTimeMillis(); List<File> fileList = new ArrayList<>(); log.info("开始分割文件"); File targetFile = new File(targetDirectoryPath); if (!sourceFile.exists() || rows <= 0 || sourceFile.isDirectory()) { return null; } if (targetFile.exists()) { if (!targetFile.isDirectory()) { return null; } } else { targetFile.mkdirs(); } try (FileInputStream fileInputStream = new FileInputStream(sourceFile); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8); BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { StringBuilder stringBuilder = new StringBuilder(); String lineStr; int lineNo = 1, fileNum = 1; while ((lineStr = bufferedReader.readLine()) != null) { stringBuilder.append(lineStr).append("\r\n"); if (lineNo % rows == 0) { File file = new File(targetDirectoryPath + File.separator + fileNum + sourceFile.getName()); writeFile(stringBuilder.toString(), file); //清空文本 stringBuilder.delete(0, stringBuilder.length()); fileNum++; fileList.add(file); } lineNo++; } if ((lineNo - 1) % rows != 0) { File file = new File(targetDirectoryPath + File.separator + fileNum + sourceFile.getName()); writeFile(stringBuilder.toString(), file); fileList.add(file); } long endTime = System.currentTimeMillis(); log.info("分割文件结束,耗时:{}秒", (endTime - startTime) / 1000); } catch (Exception e) { log.error("分割文件异常", e); } return fileList; } private static void writeFile(String text, File file) { try ( FileOutputStream fileOutputStream = new FileOutputStream(file); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter, 1024) ) { bufferedWriter.write(text); } catch (IOException e) { e.printStackTrace(); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java实现按行读取大文件Stringfile="F:"+File.separator+"a.txt";FileInputStreamfis=newFileIn
linux下文件分割可以通过split命令来实现,可以将一个大文件拆分成指定大小的多个文件,并且拆分速度非常的快,可以指定按行数分割和安大小分割两种模式。Lin
本文实例讲述了Java实现大文件的切割与合并操作。分享给大家供大家参考,具体如下:这里实现对大文件的切割与合并。按指定个数切(如把一个文件切成10份)或按指定大
很多时候我们会面临大文件无法加载到内存,或者要传输大文件的问题。这时候就需要考虑将大文件分割为小文件进行处理了。下面是一种用python分割与合并分件的实现。i
今天业务上碰到用pandas处理一个大文件的内存不够问题,需要做concat合并多个文件,每个文件数据在1.4亿行左右。当时第一反应是把dataframe分割成