0

我正在尝试查看日志.txt文件并查找错误消息的所有实例,然后让代码使用 C# 将该错误行粘贴到新文档中,并基本上创建一个单独的.txt文件,其中仅包含列出的日志文件中的错误行.

我了解如何使用 C# 搜索文档中的文本,但是在不附加文档的整个其余部分的情况下提取这些错误消息(每条通常不超过 1-2 行)的最佳方法是什么?第一个错误实例?

编辑

日志文件记录每一行的事件,错误行读取如下:

Running install update (3)
ERROR: Running install update(3) (ERROR x34293) The system was unable to update the application, check that correct version is accessible by the system.
Running install update (4)

等等

请让我知道这可不可以帮你。

4

2 回答 2

2

就像是:

foreach(var line in File.ReadLines(filename)
                        .Where(l => l.Contains("ERROR MESSAGE")))
{
    // Log line
}

此外,如果您需要行内的特定信息,您可以使用 aRegex来捕获信息。如果没有更多信息,我无法提供更好的示例。

于 2013-08-01T12:28:33.957 回答
1

您可以通过 RegEx 模式搜索文件,该模式为您提供找到的字符位置或行号(不记得)。然后,您可以获取从 RegEx 返回的那部分。

这是我自己编写的使用 RegEx 的“查找和替换”程序中的一段代码。有一些嵌套方法,但你明白了......

int foundInThisFile;
string regExPattern = FindText;
System.Text.RegularExpressions.Regex regSearch = null;

if (IgnoreCase)
    regSearch = new System.Text.RegularExpressions.Regex(regExPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline);
else
    regSearch = new System.Text.RegularExpressions.Regex(regExPattern, System.Text.RegularExpressions.RegexOptions.Multiline);

            System.Text.RegularExpressions.MatchCollection regExMatches = regSearch.Matches(reader.ReadToEnd());

            if (reader != null)
            {
                reader.Dispose();
                reader = null;
            }

            found += regExMatches.Count;
            TotalMatches(new CountEventArgs(found));

            foundInThisFile = regExMatches.Count;
            MatchesInThisFile(new CountEventArgs(foundInThisFile));

            if (regExMatches.Count > 0)
            {
                foreach (System.Text.RegularExpressions.Match match in regExMatches)
                {
                    // The first "group" is going to be the entire regex match, any other "group" is going to be the %1, %2 values that are returned
                    // Index is the character position in the entire document
                    if (match.Groups.Count > 1)
                    {
                        // This means the user wants to see the grouping results
                        string[] groupsArray = new string[match.Groups.Count - 1];

                        for (int counter = 1; counter < match.Groups.Count; counter++)
                            groupsArray[counter - 1] = match.Groups[counter].Value;

                        int lineNumber = 0;
                        string actualLine = String.Empty;

                        GetLineNumberAndLine(localPath, match.Groups[0].Index, out lineNumber, out actualLine);

                        AddToSearchResults(localPath, lineNumber, actualLine, groupsArray);

                        NewSearchResult(new SearchResultArgs(new FindReplaceItem(localPath, lineNumber, actualLine, ConvertGroupsArrayToString(groupsArray))));
                    }
                    else
                    {
                        int lineNumber = 0;
                        string actualLine = String.Empty;

                        GetLineNumberAndLine(localPath, match.Groups[0].Index, out lineNumber, out actualLine);

                        AddToSearchResults(localPath, lineNumber, actualLine);

                        NewSearchResult(new SearchResultArgs(new FindReplaceItem(localPath, lineNumber, actualLine)));
                    }
                }
            }
于 2013-08-01T12:49:39.693 回答