5

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 行は完全にコピーされるか、まったくコピーされません。

4

2 に答える 2

3

原則として非常に単純です。

10MB のバッファ (byte[]) を作成し、ソースからできるだけ多くのバイトを読み取ります。次に、後ろから改行を検索します。バッファの先頭から改行までの部分=新規ファイル。余分に読み取った部分を保持し、バッファの先頭 (オフセット 0) にコピーします。ソースがなくなるまですべてを繰り返します。

于 2013-10-28T13:51:26.663 に答える
0

これを使ってsplit -a 3 -b 100m -d filename.tar.gz newfilename

于 2013-12-02T02:41:46.210 に答える