Java プロジェクトでは、大きな csv ファイル (約 500 Mb) を生成し、そのファイルをそれぞれ最大 10 Mb サイズの複数のファイルに分割する必要があります。似たような投稿がたくさん見つかりましたが、すべての投稿で Java コードが元のファイルを正確に 10 Mb ファイルに分割し、(明らかに) レコードを切り捨てているため、いずれも私の質問に答えています。代わりに、各レコードが完全で無傷である必要があります。すべてのレコードは切り捨てられる必要があります。元の大きな csv ファイルから生成された 1 つのファイルにレコードをコピーしていて、レコードをコピーするとファイルのサイズが 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 行は完全にコピーされるか、まったくコピーされません。