如何在文本文档中搜索单词并将该单词写入新文档进行报告?

时间:2013-08-01 12:26:07

标签: c# word text-files

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

我理解如何使用C#搜索文档中的文本,但是什么是提取这些错误消息(通常不超过每行1-2行)的最佳方法,而不会附加其余的全部内容。第一个错误实例后的文档?

修改

日志文件记录每行的事件,错误行如下所示:

.txt

如果有帮助,请告诉我。

2 个答案:

答案 0 :(得分:2)

类似的东西:

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

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

答案 1 :(得分: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)));
                    }
                }
            }