我正在尝试查看日志.txt
文件并查找ERROR消息的所有实例,然后使用C#将代码粘贴到新文档中,并基本上创建一个单独的{{1仅列出日志文件中的错误行的文件。
我理解如何使用C#搜索文档中的文本,但是什么是提取这些错误消息(通常不超过每行1-2行)的最佳方法,而不会附加其余的全部内容。第一个错误实例后的文档?
修改
日志文件记录每行的事件,错误行如下所示:
.txt
等
如果有帮助,请告诉我。
答案 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)));
}
}
}