我有一个包含近2.5亿个字符的大文件。现在,我想将其分割成每个部分包含3000万个字符(因此前8个部分将包含3000万个字符,最后一个部分将包含1000万个字符)。另一个问题是,我想在下一个部分的开头包括每个文件的最后1000个字符(意味着第1个部分的最后1000个字符附加在第2个部分的开头——因此第2个部分包含3000万1000个字符,依此类推)。有人能帮助我如何以编程方式(使用Java)或使用Linux命令(以快速的方式)完成这个操作吗?
一种方法是使用常规的Unix命令来拆分文件,并在前一个文件中添加上一个文件的最后1000个字节。
首先,将文件拆分:
split -b 30000000 inputfile part.
然后,对于每个部分(忽略第一个),从前一个文件的最后1000个字节开始创建一个新文件:
unset prev
for i in part.*
do if [ -n "${prev}" ]
then
tail -c 1000 ${prev} > part.temp
cat ${i} >> part.temp
mv part.temp ${i}
fi
prev=${i}
done
unset prev
for i in part.*
do if [ -n "${prev}" ]
then
tail -c +1001 ${i} > part.temp
mv part.temp ${i}
fi
prev=${i}
done
cat part.* >> newfile
由于没有解释为什么需要重叠,所以我只是创建了它,然后将其丢弃。
long start = System.nanoTime();
long fileSize = 3200 * 1024 * 1024L;
FileChannel raf = new RandomAccessFile("deleteme.txt", "r").getChannel();
long midPoint = fileSize / 2 / 4096 * 4096;
MappedByteBuffer buffer1 = raf.map(FileChannel.MapMode.READ_ONLY, 0, midPoint + 4096);
MappedByteBuffer buffer2 = raf.map(FileChannel.MapMode.READ_ONLY, midPoint, fileSize - midPoint);
long time = System.nanoTime() - start;
System.out.printf("Took %.3f ms to map a file of %,d bytes long%n", time / 1e6, raf.size());
这是在一台安装有Windows 7 x64操作系统,内存为4 GB的计算机上运行。
Took 3.302 ms to map a file of 3,355,443,200 bytes long
您可以使用BreakIterator类及其静态方法getCharacterInstance()来实现。它会返回一个新的BreakIterator实例,用于默认语言环境下的字符分隔。
您还可以使用getWordInstance()、getLineInstance()等方法来分隔单词、行等。
例如:
BreakIterator boundary = BreakIterator.getCharacterInstance();
boundary.setText("Your_Sentence");
int start = boundary.first();
int end = boundary.next();
迭代它...以获取字符....
更多细节请查看此链接:
http://docs.oracle.com/javase/6/docs/api/java/text/BreakIterator.html