同时比较文本文件的有效方法

时间:2014-07-17 17:46:13

标签: c# filestream performance

我确实检查过是否有任何问题与我的问题相符但我没有看到,如果我这样做,我的错误。

我有两个文本文件要相互比较,一个是有时被覆盖的临时日志文件,另一个是永久日志,它将收集临时日志的所有内容并将其附加到一个文件中(它会在上次检查时收集日志中的新行,并将新行附加到完整日志的末尾)。但是在一点之后,这可能会导致完整的日志变得非常大,因此无法进行比较,所以我一直在考虑采用不同的方法来解决这个问题。

我的第一个想法是"缓冲"临时日志(通常是两个中较小的一个)字符串放入一个列表中,只需循环遍历归档日志并执行以下操作:

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
        }
    }
}

正如我所说,我不确定这是否有效,或者它可能比第一种方法更有效,所以我想我会问,看看是否有人了解这可能是如何正确的实施,以及它是否是最有效的方法,或者有更好的方法。

1 个答案:

答案 0 :(得分:2)

实际上你想要的是一组中不在另一组中的所有项目。这是设置减法,或以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);

当然,这段代码需要将临时文件中的所有行都放入内存中,因为这就是Except的实现方式。它会创建所有项目的HashSet,以便它可以有效地从其他序列中找到匹配项。

大概这里需要添加的行数非常少,所以我们在这里找到的行都需要存储在内存中这一事实不是问题。如果可能存在 lot ,你需要将它们写到除第一个文件之外的另一个文件中(如果需要,可能在完成时将两个文件连接在一起)。