我有一个大文件包含近2.5亿个字符。现在,我想将它分成每个包含3000万个字符的部分(所以前8个部分将包含3000万个,最后部分将包含1000万个字符)。另一点是我希望在下一部分的开头包含每个文件的最后1000个字符(意味着第1部分的最后1000个字符附加在第2部分的开头 - 所以,第2部分包含3000万个1000字符,依此类推)。任何人都可以帮助我如何使用Java编程(使用Java)或使用Linux命令(以快速方式)。
答案 0 :(得分:2)
您可能希望使用更复杂的shell脚本或使用其他一些脚本语言来驱动这些程序,以便为它们提供适当的参数(特别是为了处理您的重叠需求)。也许您可以将它们与其他工具结合使用(例如grep
或head
或tail
或sed
或awk
等....)。
答案 1 :(得分:2)
一种方法是使用常规的unix命令来拆分文件,并在前一个文件的前1000个字节前加上。
首先拆分文件:
split -b 30000000 inputfile part.
然后,对于每个部分(忽略了farst,创建一个以前一个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
在组装之前,我们再次遍历文件,忽略第一个并丢弃前1000个字节:
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
由于没有解释为什么需要重叠,我只是创建它然后扔掉它。
答案 2 :(得分:2)
你可以试试这个。我必须第一次使用read / mode,因为文件最初并不存在。如此代码所示,您只能使用只读。
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());
这是在带有4 GB内存的Window 7 x64机箱上运行。
Took 3.302 ms to map a file of 3,355,443,200 bytes long
答案 3 :(得分:1)
您可以使用BreakIterator类及其静态方法getCharacterInstance()来完成此操作。它返回一个新的BreakIterator实例,用于默认语言环境的字符分隔符。
你也可以使用getWordInstance(),getLineInstance()..来打破单词,行......等等。
例如:
BreakIterator boundary = BreakIterator.getCharacterInstance();
boundary.setText("Your_Sentence");
int start = boundary.first();
int end = boundary.next();
Iterate over it... to get the Characters....
For more detail look at this link:
http://docs.oracle.com/javase/6/docs/api/java/text/BreakIterator.html