-1

I have a log file as follows

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

If I want to split the above log file by spaces first, it will split up to date first and then time and CDF and so on.

Is there any possible way to get whole first column [10-10-2013 10.10.10.333 CDF] as one column and then work on it.

4

4 回答 4

3

根据您提供给我们的信息,您只需将子字符串从 0带到].

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

正如您所要求的,这将为您提供整个第一列。然后,您将为每一行执行此操作。然后,如果这些都在一个文件中,您可以说:

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

然后,如果您需要拆分第一列,您可以拆分' '

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:这就是为什么关于如何提问的指导方针要具体

于 2013-07-07T17:23:58.217 回答
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]
            );
        }
    }
}
于 2013-07-07T17:39:27.830 回答
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;

}

于 2013-07-08T06:25:59.923 回答
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。

于 2013-07-08T06:31:48.590 回答