我有一个日志文件如下
[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]作为一个列然后进行处理。
答案 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即可。