簡體   English   中英

Java 文件替換行

[英]Java File Replace Lines

我有一個 250 GB 的大 .txt 文件,而我的硬盤上只剩下 50 GB 的空間。 這個 .txt 文件中的每一行都有一個長前綴,我想刪除這個前綴以使該文件更小。

首先,我想逐行讀取,更改它並將其寫入另一個文件。

// read line out of first file
line = line.replace(prefix, "");
// write line into second file

問題是我沒有足夠的空間。

那么如何從我的文件中刪除所有前綴?

檢查RandomAccessFile: http//docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html

您必須跟蹤您正在閱讀的位置以及您要寫入的位置。 最初兩者都在開始。 然后你讀N個字節(一行),縮短它,尋找N個字節並寫M個字節(縮短的行)。 然后你尋找前向(N - M)字節,回到下一行開始的位置。 然后你一遍又一遍地這樣做。 最后用setLength(long)截斷多余。

您也可以批量執行(如讀取4kb,處理,寫入,重復)以提高效率。

該過程在所有語言中都是相同的。 有些人通過在API后面隱藏搜索來更容易。

當然,你必須絕對確保你的程序完美無缺,因為沒有辦法撤消這個過程。

此外,RandomAccessFile有點受限,因為它無法告訴您文件在給定時刻的位置。 因此,您必須在“解碼字符串”和“編碼字節”之間進行轉換。 如果您的文件是UTF-8,則字符串中的給定字符可以占用文件中的一個字節。 所以你不能只做seek(string.length())。 您必須使用seek(string.getBytes(encoding).length)並考慮可能的換行符轉換(Windows使用兩個字符進行換行,Unix只使用一個)。 但是如果你有ASCII,ISO-Latin-1或類似的普通字符編碼並且知道文件有哪些換行符,那么問題應該非常簡單。

當我編輯我的答案以匹配所有可能的極端情況時,我認為最好使用BufferedReader讀取文件並更正字符編碼,並打開RandomAccessFile進行寫入。 如果您的操作系統支持將文件打開兩次。 這樣您就可以從BufferedReader獲得完整的Unicode支持,並且您不必跟蹤讀取和寫入位置。 您必須使用RandomAccessFile進行寫入,因為對文件使用Writer可能只是截斷它(盡管沒有嘗試過)。

像這樣的東西。 它適用於瑣碎的例子,但它沒有錯誤檢查,我絕對不保證。 首先在較小的文件上測試它。

public static void main(String[] args) throws IOException {
    File f = new File(args[0]);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            new FileInputStream(f), "UTF-8")); // Use correct encoding here.
    RandomAccessFile writer = new RandomAccessFile(f, "rw");

    String line = null;
    long totalWritten = 0;
    while ((line = reader.readLine()) != null) {
        line = line.trim() + "\n"; // Remove your prefix here.

        byte[] b = line.getBytes("UTF-8");
        writer.write(b);
        totalWritten += b.length;
    }

    reader.close();

    writer.setLength(totalWritten);
    writer.close();
}

您可以使用RandomAccessFile 這允許您覆蓋文件的一部分。 由於javadoc中沒有提到復制或緩存機制,因此無需額外的磁盤空間即可使用。

所以你可以用空格覆蓋不需要的部分。

將 250 GB 文件拆分為 5 個文件,每個文件為 50 GB。 然后處理每個文件,然后將其刪除。 這樣,您的機器上將始終有 50 GB 剩余空間,您還可以處理 250 GB 文件。

既然不必在Java中完成 ,我會為此推薦Python:

將replace.py中的以下內容保存在與文本文件相同的文件夾中:

import fileinput

for line in fileinput.input("your-file.txt", inplace=True):
    print "%s" % (line.replace("oldstring", "newstring"))

用你的字符串替換兩個字符串並執行python replace.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM