次のようなログファイルがあります
[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] を 1 つの列として取得し、それに取り組む方法はありますか。
次のようなログファイルがあります
[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] を 1 つの列として取得し、それに取り組む方法はありますか。
必要な情報を取得するために、正規表現を使用して各行を解析できます。
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]
);
}
}
}
提供された情報に基づいて、 0 から のインデックスまでの部分文字列を取得できます。]
string ExtractFirstColumn(line) {
int index = line.IndexOf("]");
string firstColumn = line.Substring(0, index + 1);
return firstColumn;
}
あなたが求めたように、これで最初の列全体が得られます。次に、各行に対してこれを行います。次に、これらがすべて 1つのファイルにある場合は、次のように言えます。
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] };
}
あなたが私たちに与えてくれた 2 つの例だけを取り上げますが、新しい情報がなければ、この非常に単純で保守可能なアプローチから始めます。
1 : これが、質問の仕方に関するガイドラインが具体的であると述べている理由です。
以下は@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 を使用できます。
以下は@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;
}