在一个Java项目中,我生成了一个大型的CSV文件(约500 MB),我需要将该文件分割成多个文件,每个文件的大小最多为10 MB。我发现很多帖子都类似,但是没有一个回答我的问题,因为在所有帖子中,Java代码会将原始文件拆分为确切的10 MB文件,并且(显然)截断记录。相反,我需要每条记录都完整无缺,不应该被截断。如果我从原始大型CSV文件复制一条记录到一个生成的文件中,如果我复制该记录,则文件尺寸将溢出10 MB,我应该能够不复制该记录,关闭该文件,创建一个新文件并将该记录复制到新文件中。这可能吗?有人能帮帮我吗?谢谢!
我尝试了这段代码:
我尝试了这段代码:
File f = new File("/home/luca/Desktop/test/images.csv");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
FileOutputStream out;
String name = f.getName();
int partCounter = 1;
int sizeOfFiles = 10 * 1024 * 1024;// 1MB
byte[] buffer = new byte[sizeOfFiles];
int tmp = 0;
while ((tmp = bis.read(buffer)) > 0) {
File newFile=new File("/home/luca/Desktop/test/"+name+"."+String.format("%03d", partCounter++));
newFile.createNewFile();
out = new FileOutputStream(newFile);
out.write(buffer,0,tmp);
out.close();
}
但显然它不起作用。此代码将源文件分割成n个10Mb的文件,截断记录。在我的情况下,我的CSV文件有16列,因此使用上述过程,例如,最后一条记录只有5列填充。其他被截断了。
解决方案 这里是我编写的代码。
FileReader fileReader = new FileReader("/home/luca/Desktop/test/images.csv");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line="";
int fileSize = 0;
BufferedWriter fos = new BufferedWriter(new FileWriter("/home/luca/Desktop/test/images_"+new Date().getTime()+".csv",true));
while((line = bufferedReader.readLine()) != null) {
if(fileSize + line.getBytes().length > 9.5 * 1024 * 1024){
fos.flush();
fos.close();
fos = new BufferedWriter(new FileWriter("/home/luca/Desktop/test/images_"+new Date().getTime()+".csv",true));
fos.write(line+"\n");
fileSize = line.getBytes().length;
}else{
fos.write(line+"\n");
fileSize += line.getBytes().length;
}
}
fos.flush();
fos.close();
bufferedReader.close();
这段代码读取一个csv文件并将其分割成n个文件,每个文件最大为10 Mb,并且每个csv行要么完全复制,要么完全不复制。