【问题标题】:Split File - Java/Linux拆分文件 - Java/Linux
【发布时间】:2012-06-25 03:25:25
【问题描述】:

我有一个包含近 2.5 亿个字符的大文件。现在,我想将它拆分为每个包含 3000 万个字符的部分(因此前 8 个部分将包含 3000 万个字符,最后一部分将包含 1000 万个字符)。另一点是我想在下一部分的开头包含每个文件的最后 1000 个字符(意味着第 1 部分的最后 1000 个字符附加在第 2 部分的开头 - 所以,第 2 部分包含 3000 万个 1000 个字符,依此类推)。任何人都可以帮助我如何以编程方式(使用 Java)或使用 Linux 命令(以快速方式)。

【问题讨论】:

  • 为什么需要重叠?如果你不需要它,你可以使用 split 和 cat 命令。
  • 我很想知道重叠部分的用例是什么。
  • @RogerLindsjö,不,我需要重叠。
  • “我想把它分成几个部分,每个部分包含 3000 万个字符” 这是一件令人惊讶的事情,你确定你不是出于某种原因这样做,或者这个理由对你来说足够了吗?
  • @RogerLindsjö 实际上,通过重叠字符,我不想错过我离开的上一个文件的任何信息。

标签: java linux


【解决方案1】:

一种方法是使用常规的 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

在组装之前,我们再次遍历文件,忽略第一个并丢弃前 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】:

    只需使用适当的选项splitcsplit 命令。

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

    【讨论】:

    • 这些中的任何一个都像 OP 想要的那样有重叠部分吗?
    • 谢谢。但是,没有关于字符数和附加最后 1000 个字符的夹板。
    【解决方案3】:

    你可以试试这个。我必须第一次使用读取/模式,因为文件一开始不存在。您可以按照此代码的建议使用只读。

    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
    

    【讨论】:

      【解决方案4】:

      您可以使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 2011-09-12
        • 2023-04-02
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        相关资源
        最近更新 更多