2013-10-28 145 views
4

我生成一个大的csv文件(大约500 MB),我需要将该文件分割成多个文件,每个文件最多为10 Mb。 我发现很多类似的帖子,但他们中的任何一个都回答我的问题,因为在所有帖子中,java代码将原始文件分割成10个Mb文件,并且(显然)截断了记录。 相反,我需要每个记录完整,完整。 任何记录都应该被截断。 如果我从原始的大csv文件复制到一个生成的文件的记录,并且文件维度将溢出10 Mb如果我复制记录,我应该能够不复制该记录,关闭该文件,创建一个新的将文件复制到新文件中。 这可能吗? 有人可以帮我吗? 谢谢!如何在一个Java项目中将csv文件拆分成多个文件,大小为

我试过这段代码:

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行完全复制或不可复制的。

+0

你到目前为止尝试过哪些代码?如果你只是想让别人为你编写程序,你需要聘请一名程序员。 – nhgrif

+0

它是自由职业者的良好SPEC。 –

+0

没有理由回答这么粗鲁,我不是自由职业者。 – lucavenanzetti

回答

2

原则上很简单。

您可以创建一个10MB(byte [])的缓冲区并从源读取尽可能多的字节。然后您从后面中搜索换行符。从缓冲区开始到换行的部分=新文件。您保留您读取的部分过量并将其复制到缓冲区开始处(偏移量0)。你重复一切,直到没有更多的来源。

+0

谢谢。我还添加了解决方案。 – lucavenanzetti

0

使用此split -a 3 -b 100m -d filename.tar.gz newfilename

+0

这会截断每个分割文件末尾的单个记录。 – eaubin

相关问题