2

タイムスタンプ付きの値を記録するファイルがあります。特定の時間後に特定の値を読み取る必要があります。

例えば

ファイルには

2013-03-03 19:08:22    car   2001 Ford
2013-03-03 19:08:27    Truck 2012 Chevy
2013-03-03 19:08:44    car 2008   Honda
2013-03-03 19:08:55    car 2011   Ford
2013-03-03 19:09:21    car 2005   Nissan
2013-03-03 19:08:29    car 2003   Cadillac
2013-03-03 19:08:32    car 2009   Jeep
2013-03-03 19:08:52    car 2007   Suburban

Chevy の最初のインスタンスの時間を読み取りたいのですが、それに 40 秒を追加してから、その時間の後に Ford が表示される時間を読み取ります。

So based upon the above log
First Chevy is at   19:08:27  
Add 40 seconds      19:09:07
Now Read first Ford that shows up after 19:09:07  in this case that would be one at 19:08:55

私は正規表現に慣れていないので、書き方がよくわかりません。ありがとう

4

1 に答える 1

1

まず第一に、そのために正規表現を使用することはお勧めしませんが、使用できるものを次に示します

var data =  @"2013-03-03 19:08:22    car   2001 Ford
2013-03-03 19:08:27    Truck 2012 Chevy
2013-03-03 19:08:44    car 2008   Honda
2013-03-03 19:08:55    car 2011   Ford
2013-03-03 19:09:21    car 2005   Nissan
2013-03-03 19:08:29    car 2003   Cadillac
2013-03-03 19:08:32    car 2009   Jeep
2013-03-03 19:08:52    car 2007   Suburban";

string regex =
    @"(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})[^\n\r]+?Chevy.+?(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})[^\n\r]+?Ford";
var m = Regex.Match(data, regex, RegexOptions.Singleline);

Console.WriteLine("Chevy date: {0}", DateTime.Parse(m.Groups[1].Value));
Console.WriteLine("Ford date: {0}", DateTime.Parse(m.Groups[2].Value));

上記のコードは次のように表示されます。

Chevy date: 2013-03-03 19:08:27
Ford date: 2013-03-03 19:08:55

40 秒追加するだけです。AddSeconds(..)のメソッドを使用して実行できますDateTime

編集:上記の正規表現の説明:

  • (\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})いくつかの DateTime に一致
  • [^\n\r]+?Chevy同じ行で「Chevy」を一致させてみてください
  • .+?テキストのチャンクに一致...
  • (\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})再びDateTimeと一致するまで...
  • [^\n\r]+?Ford...同じ行に「フォード」があります

編集:正規表現を使用する必要のない別のアプローチを次に示します。

using (var reader = new StreamReader(@"C:\file-here.txt")) {
    bool chevyFound = false;
    while (!reader.EndOfStream) {
        var line = reader.ReadLine().Trim();

        if (chevyFound && line.EndsWith("Ford")) {
            var fordDate = DateTime.Parse(line.Substring(0, 19));
            Console.WriteLine("Ford Date: {0}", fordDate);
            break;
        }

        if (line.EndsWith("Chevy")) {
            var chevyDate = DateTime.Parse(line.Substring(0, 19));
            Console.WriteLine("Chevy Date: {0}", chevyDate);
            chevyFound = true;
        }
    }
}

おそらく、誰かが正規表現を使用する必要があると言ったとき、彼/彼女は DateTimes を解析するときのことを意味していました (実行する代わりにSubstring(0,19))。その場合、次のように置き換えることができます。

var chevyDate = DateTime.Parse(Regex.Match(line, "^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}").Value)
于 2013-03-06T06:29:25.597 に答える