0

いくつかのログファイルを解析して、分析のためにデータベースに入れようとしています。1行は次のようになります。

2012-09-30 17:16:27,213 [39] (boxes) ERROR Assembly.Places [(null)] - Error while displaying a thing

前の日付を引き出​​してそのように行を分割するのに適した正規表現を作成しましたが、日付自体を失います。これは非常に重要なデータであり、失いたくありません。

\r\n一部のログは開発者のスタックトレースを含む致命的なエラーであるため、これを行うことはできません。それらは、明らかに、\r\nそれらを読みやすくするために使用します。

私の現在のコードは参考のために次のようになります。

var logpath = Directory.GetFiles(@"C:\a\directory", "*.log");
foreach (var log in logpath)
{
    var fileStream = new StreamReader(log);
    var fileString = fileStream.ReadToEnd();
    var records = Regex.Split(fileString, "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}");
            ...
}
4

3 に答える 3

1

Split()一致した区切り文字は常に削除されます。秘訣は、実際のテキストではなく、文字列内の位置と一致させることです。

これは、ゼロ幅の先読みによって行われます。

var datePattern = "^(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})";
var datePositions = new Regex(datePattern, RegexOptions.Multiline);

// ...

Regex.Split(fileString, datePositions);
于 2012-10-17T17:27:12.920 に答える
0

代わりmatchsplitting

これは正規表現です。使用singleLineモード

([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})(.*?)((?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}|$))

グループ1には日付が含まれています

グループ2には必要な日付が含まれています

ノート

正規表現は概念的にはこのようなものです。

(yourDate)(.*?yourdata)(?=till the other date|$)

使用することを忘れないでくださいsinglelineMode

于 2012-10-17T17:21:32.340 に答える
0

まあ、私はこのテーマの専門家ではありませんが、これを見つけました:Regex.Match

私が見たところ、日付形式の最初の一致は、 Matchオブジェクトを使用して受け取ることができます。このオブジェクトには、あらゆる種類の優れたプロパティがまとめられており、おそらく必要な部分を切り取ることができます。

psには、ファイル内のすべての一致を返すRegex.Matchesも存在し、使いやすい場合があります。

申し訳ありませんが、完全なコード例を見つける時間がありません。

良い一日

于 2012-10-17T17:36:42.603 に答える