使用拆分从日志文件中获取所需信息

时间:2013-07-07 17:17:54

标签: c#

我有一个日志文件如下

 [10-10-2013 10.10.10.333 CDF] Column2 Column3
 [11-10-2013 10.10.10.333 CDF] Column2 Column3

如果我想首先按空格拆分上述日志文件,它将首先拆分为日期,然后是时间和CDF等等。

是否有任何可能的方法将整个第一列[10-10-2013 10.10.10.333 CDF]作为一个列然后进行处理。

4 个答案:

答案 0 :(得分:3)

根据您提供给我们的信息,您只需从0 substring获取index of the ]

string ExtractFirstColumn(line) {
    int index = line.IndexOf("]");
    string firstColumn = line.Substring(0, index + 1);
    return firstColumn;
}

根据您的要求,这将为您提供整个第一列。然后你会do this for each line。然后,如果这些都在single file中,您可以说:

var lines = File.ReadLines(log);
var firstColumns = lines.Select(line => ExtractFirstColumn(line));

然后,如果您需要split第一列,则可以在' '上拆分:

var tokens = firstColumn.Split(' ');
// tokens[0].Remove("[") is the data
// tokens[1] is the time
// tokens[2].Remove("]") is "CDF"

如果你需要的不仅仅是第一列,因为你现在 在你的评论 1 中指出,你将不得不采取不同的方式:

string[] ExtractColumns(string line) {
    int index = line.IndexOf("]");
    string firstColumn = line.Substring(0, index + 1);
    string[] lastTwoColumns = line.Substring(index + 2).Split(' ');
    return new string[] { firstColumn, lastTwoColumns[1], lastTwoColumns[2] };
}

我只是关注你给我们的两个例子,但是我会从没有新信息的这个非常简单,可维护的方法开始。

1 :这就是guidelines for how to ask a question具体说明的原因。

答案 1 :(得分:3)

您可以使用正则表达式来解析每一行,以便检索所需的信息:

using System;
using System.IO;
using System.Text.RegularExpressions;

class Program
{
    private static Regex regex = new Regex(
        @"\[([0-9\-]{10}) ([0-9\.]+) (.+)\] (.+) (.+)", 
        RegexOptions.Compiled
    );

    public static void Main()
    {
        foreach (string line in File.ReadLines("log.txt"))
        {
            string[] parts = regex.Split(line);
            Console.WriteLine(
                "date: {0}, ip: {1}, name: {2}, column 2: {3}, column 3: {4}", 
                parts[1], 
                parts[2], 
                parts[3], 
                parts[4], 
                parts[5]
            );
        }
    }
}

答案 2 :(得分:0)

以下是@siride给出的答案

最简单的方法是使用正则表达式,而不是使用split和indexof操作。

正则表达式允许您指定一种模式,从中可以以简单的方式提取字符串。如果格式发生变化,或者最初没有考虑到某些细微之处,可以通过调整表达式来解决问题,而不是重写一堆代码。

以下是.NET中正则表达式的一些文档:http://msdn.microsoft.com/en-us/library/az24scfc.aspx

这是一些示例代码,可能会执行您想要的操作。您可能需要稍微调整一下才能获得所需的结果。

var m = Regex.Match(currentLine, @"^\[(?<date>[^\]]*)\]\s+(?<int>[0-9]+)\s+(?    <message>.*)\s*$");
if(m.Success) {
// may need to do something fancier to parse the date, but that's an exercise for the reader
var myDate = DateTime.Parse(m.Groups["date"].Value);
var myInt = int.Parse(m.Groups["int"].Value);
var myMessage = m.Groups["message"].Value;

}

答案 3 :(得分:0)

以下是@msarchet给出的答案

最简单的方法是使用String.Split和String.Substring

通常我会这样做:

//find the indices of the []
var leftIndex = currentLine.IndexOf("[");
var rightIndex = currentLine.IndexOf("]");

//this get's the date portion of the string
var dateSubstring = currentLine.Substring(leftIndex, rightIndex - leftIndex);

var dateParts = dateSubstring.Split(new char[] {'.'});

// get the datetime portion

var dateTime = dateParts[0];

var milliseconds = Int16.Parse(dateParts[1]);

修改

由于日期部分是固定宽度,因此您只需使用Substring即可。