首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分文件- Java/Linux

拆分文件- Java/Linux
EN

Stack Overflow用户
提问于 2012-06-25 02:26:52
回答 4查看 1.8K关注 0票数 3

我有一个包含近2.5亿个字符的大文件。现在,我想把它分成几个部分,每个部分包含3000万个字符(所以前8个部分包含3000万个字符,最后一个部分包含1000万个字符)。另一点是,我想在下一部分的开头包括每个文件的最后1000个字符(意思是第一部分的最后1000个字符附加在第二部分的开头-所以,第二部分包含3000万个字符,依此类推)。有没有人可以教我如何编程(使用Java)或使用Linux命令(快速)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-25 03:10:38

一种方法是使用常规的unix命令来拆分文件,并预先考虑前一个文件的最后1000个字节。

首先拆分文件:

代码语言:javascript
复制
split -b 30000000 inputfile part.

然后,对于每个部分(忽略farst ),创建一个新文件,从前面的最后1000个字节开始:

代码语言:javascript
复制
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个字节:

代码语言:javascript
复制
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

最后一步是重新组装文件:

代码语言:javascript
复制
cat part.* >> newfile

因为没有解释为什么需要重叠,所以我只是创建了它,然后把它扔掉了。

票数 2
EN

Stack Overflow用户

发布于 2012-06-25 02:28:56

只需使用带有适当选项的splitcsplit命令即可。

您可能希望使用更复杂的shell脚本或其他脚本语言来驱动这些程序,以便为它们提供适当的参数(特别是为了处理重叠的需求)。也许您可以将它们与其他实用程序(如grepheadtailsedawk等)结合使用。

票数 2
EN

Stack Overflow用户

发布于 2012-06-25 03:25:26

你可以试试这个。我不得不在第一次使用read/mode,因为这个文件一开始并不存在。你可以按照这段代码建议的那样使用只读。

代码语言:javascript
复制
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计算机上运行。

代码语言:javascript
复制
Took 3.302 ms to map a file of 3,355,443,200 bytes long
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11180078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档