在一个
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行完全复制或根本不复制.
最佳答案 原则上很简单.
您可以创建一个10MB(byte [])的缓冲区,并从源中读取尽可能多的字节.然后从后面搜索换行符.从缓冲区开头到换行符的部分=新文件.保留已读取的部分,并将其复制到缓冲区的起始位置(偏移0).你重复一切,直到没有更多的来源.