簡體   English   中英

同時比較文本文件的有效方法

[英]Efficient Methods of Comparing Text Files Simultaneously

我確實檢查了是否有任何現有的問題與我的相符,但我沒有發現任何我的錯誤(如果有的話)。

我有兩個文本文件要相互比較,一個是有時被覆蓋的臨時日志文件,另一個是永久日志,它將收集臨時日志的所有內容並將其附加到一個文件中(它將收集自上次檢查以來在日志中添加了新行,並將新行追加到完整日志的末尾)。 但是,在此之后,這可能會導致整個日志變得相當大,因此進行比較時效率不高,因此我一直在考慮采用不同的方法來解決此問題。

我的第一個想法是將臨時日志(通常是兩者中的較小者)字符串“緩沖”到列表中,然后簡單地遍歷存檔日志並執行以下操作:

List<String> bufferedlines = new List<string>();
using (StreamReader ArchiveStream = new StreamReader(ArchivePath))
{
    if (bufferedlines.Contains(ArchiveStream.ReadLine()))
    {

    }
}

現在,有兩種方法可以從這里繼續進行,我可以創建另一個列表來存儲不一致之處,關閉讀取流(我不確定您是否可以同時進行讀寫操作,如果可以的話)使我的選擇更容易),然后在附加模式下打開寫入流,並將列表寫入文件。 或者,為了消除不一致的緩沖,我可以在比較文件時打開寫流,並當場寫出不匹配的行。

我想到的另一種方法是受我是否可以完成的知識所限制,而不是緩沖兩個文件,而是在讀取流時並排比較流,並動態添加行。 就像是:

using (StreamReader ArchiveStream = new StreamReader(ArchivePath))
{
    using (StreamReader templogStream = new StreamReader(tempPath))
    {
        if (!(ArchiveStream.ReadAllLines.Contains(TemplogStream.ReadLine())))
        {
            //write the line to the file
        }
    }
}

正如我說的那樣,我不確定這是否會比第一種方法有效,或者它是否會比第一種方法更有效,所以我想問一下,看看是否有人對如何正確實施該方法有深入的了解,以及它是否是可行的方法。最有效的方法,或者還有更好的方法。

實際上,您想要的是一組中所有不在另一組中的項目。 這是設置減法,或者用LINQ術語設置( Except 如果您的數據集足夠小,則可以執行以下操作:

var lines =  File.ReadLines(TempPath)
    .Except(File.ReadLines(ArchivePath))
    .ToList();//can't write to the file while reading from it
File.AppendAllLines(ArchivePath, lines);

當然,此代碼需要將temp文件中的所有行都放入內存,因為這正是Except的實現方式。 它創建所有項目的HashSet ,以便可以從其他序列中高效地找到匹配項。

大概這里需要添加的行數很小,因此我們在這里找到的所有行都需要存儲在內存中這一事實並不是問題。 如果可能有很多文件,則需要將它們寫到除第一個文件之外的另一個文件中(如果需要,可以將兩個文件合並在一起)。

暫無
暫無

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

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