3

我有两个或多个日志文件将合并到一个新文件中。

日志文件格式可能像

Dir1 File1Path1 File1Path2 Timestamp tempfileName
Dir1 File2Path1 File2Path2 Timestamp tempfileName
Dir2 File1Path1 File1Path2 Timestamp tempfileName`

Dir3 File1Path1 File1Path2 Timestamp tempfileName
Dir3 File2Path1 File2Path2 Timestamp tempfileName
Dir3 File1Path1 File1Path2 Timestamp tempfileName
Dir4 File1Path1 File1Path2 Timestamp tempfileName`

等等

我的要求如下;

  1. 检查每个日志文件中每一行的格式是否正确,即记录所有值
  2. 检查没有重复
  3. 验证文件是否正确合并,即每个日志文件中的所有日志行都已合并到新的日志文件中。
  4. 将新合并文件与基线文件进行比较

我已经为 1 编写了代码。我读取文件并将内容按行/列加载到数据集中。

        data.Tables[tableName].Columns.Add("Dir");
        data.Tables[tableName].Columns.Add("Path1");
        data.Tables[tableName].Columns.Add("Path2");

        using (StreamReader reader = new StreamReader(log))
        {
            string line = string.Empty;
            while ((line = reader.ReadLine()) != null)
             {
                 data.Tables[tableName].Rows.Add(line.Split(new string[] { "\t" }, data.Tables[tableName].Columns.Count, StringSplitOptions.RemoveEmptyEntries));
             }
        }

但是要完成其余的任务,我不确定将这些行加载到数据集中是否正确?什么是最快和更好的方法?我可以遍历每一行值并与休息进行比较,但我认为它不会更快。日志文件可以在 20 - 45MB 之间。

合并后的日志内容应该是这样的(行可以按任意顺序)

Dir1 File1Path1 File1Path2 Timestamp tempfileName
Dir1 File2Path1 File2Path2 Timestamp tempfileName
Dir2 File1Path1 File1Path2 Timestamp tempfileName
Dir4 File1Path1 File1Path2 Timestamp tempfileName
Dir3 File1Path1 File1Path2 Timestamp tempfileName
Dir3 File2Path1 File2Path2 Timestamp tempfileName
Dir3 File1Path1 File1Path2 Timestamp tempfileName

感谢您的关注。

4

1 回答 1

2

如果您可以一次将所有数据加载到内存中,那么检查重复项很容易:只需加载数据并让 LINQ 删除重复项。那是:

List<string> lines = LoadEverything();
foreach (line in lines.Distinct()) // might want to supply an equality comparer
{
    // write line to output file
}

如果您不能一次加载内存中的所有文件,则加载每个文件,对其进行排序,然后将排序后的列表输出到一个新文件。然后对已排序的文件进行n 路合并以删除重复项。

List.Contains()这些中的任何一个都将比在任何显着大小的列表上使用要快得多。

您没有说是否要从每个单独的文件中删除重复项,或者是否要从组合文件中删除重复项。从单个文件中删除重复项很容易:只需将每个文件加载到内存中,Distinct对其执行操作,然后将其写入输出。上面的讨论假设您想从组合文件中删除重复项,如果您不能一次将所有内容加载到内存中,这会有点困难。

如果您只想确定是否有重复项,以及这些重复项是什么:

var dupes = 
    lines.GroupBy(l => l)
         .Select(g => new { Value = g.Key, Count = g.Count() })
         .Where(g => g.Count > 1);
foreach (var d in dupes)
{
    Console.WriteLine("'{0}' is a dupe.", d.Key);
}

或者,如果您只想知道是否有任何重复:

if (dupes.Any())
    Console.WriteLine("There are duplicates!");
于 2013-09-10T19:40:41.863 回答