【问题标题】:Reading values from a file using regex or some other parsing使用正则表达式或其他解析从文件中读取值
【发布时间】:2013-02-20 19:18:28
【问题描述】:

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

例如

文件有

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

我是正则表达式的新手,不知道怎么写。谢谢

【问题讨论】:

  • 请用简单的英文解释,无法理解您的问题
  • StackOverflow 不是寻求解决方案的地方。向我们展示您尝试过的内容,展示一些代码示例。只有这样人们才会帮助你。否则很有可能 - 你会被否决。在旁注中 - 我认为在你的情况下使用正则表达式是不明智的。
  • 这是作业吗?如果不是这样,那么正则表达式对于这种简单的文件操作来说真的是矫枉过正。
  • 正如描述中提到的,我是 RegEx 的新手,而且我也没有要求给我写解决方案,只是一些入门指南。

标签: c# .net regex parsing


【解决方案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 秒。您可以使用DateTime 中的AddSeconds(..) 方法来完成。

编辑:上述正则表达式解释:

  • (\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}) 匹配一些日期时间
  • [^\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)

【讨论】:

  • 谢谢奥斯卡。为什么你不建议不使用 RegEx 以及你认为我应该使用什么其他解决方案。
  • @J.Davidson 看到我的编辑。当我说“不使用正则表达式”时,我不只使用正则表达式(而是逐行读取等),尽管正如您在我的编辑中看到的那样,您仍然可以使用正则表达式来解析日期。
  • @J.Davidson 我看到你发布了一个新问题here。如果我的回答没有解决您的问题,请随时在此处发表评论。如果有,请接受它作为答案。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多