使用正则表达式或其他一些解析从文件中读取值

时间:2013-03-06 05:48:53

标签: c# .net regex parsing

我有一个记录带时间戳的值的文件。我必须在特定时间后读取某些值。

例如

档案

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

我想读一下雪佛兰的第一个实例的时间,而不是读取40秒,而不是在那之后阅读福特出现的那个。

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

我是regex的新手,不知道如何写它。感谢

1 个答案:

答案 0 :(得分:0)

首先,我真的不建议你使用正则表达式,但这里有一个你可以使用的:

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尝试在同一行中匹配“雪佛兰”
  • .+?匹配一大块文字......
  • (\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)