static void Main(string[] args)
{
string directory = @".";
string fileSearchPattern = "sql.log*";
string matchExpression = ": Information Link";
string replaceExpression = @"(?<Timestamp>[\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:[\d]{2},[\d]{3}) \[\*Thread-(?<Thread>[\d]+),\s(?<User>[\w\d_]+)[^]]*\*\][^:]*: Information Link\s*(?:'(?<Informationlink>.*)')*\s*(\((?<Guid>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})\))*\s*(?<Result>[a-z ]+), time: (?<Executiontime>[\dE.]*) seconds";
char fieldSeperator = ';';
Regex extractRegex = new Regex(replaceExpression);
Regex matchRegex = new Regex(matchExpression);
// Write Header
string[] fieldNames = extractRegex.GetGroupNames();
StringBuilder replacementStringBuilder = new StringBuilder();
// Make sure group 0 and 1 is not included.
for (int i = 2; i < fieldNames.Length; ++i)
{
if (i > 2)
{
Console.Write(fieldSeperator);
replacementStringBuilder.Append(fieldSeperator);
}
Console.Write(fieldNames[i]);
replacementStringBuilder.Append('$');
replacementStringBuilder.Append('{');
replacementStringBuilder.Append(fieldNames[i]);
replacementStringBuilder.Append('}');
}
Console.WriteLine();
// Read files and extract information.
string line = string.Empty;
string replacementString = replacementStringBuilder.ToString();
foreach (FileInfo fileInfo in new DirectoryInfo(directory).GetFiles(fileSearchPattern))
{
using (TextReader reader = new StreamReader(fileInfo.FullName))
{
while (reader.Peek() > 0)
{
line = reader.ReadLine();
if (matchRegex.IsMatch(line))
{
string output = extractRegex.Replace(line, replacementString);
Console.WriteLine(output);
}
}
}
}
}