2013-03-06 13 views
1

我有一個記錄具有時間戳的值的文件。在特定的時間之後,我必須閱讀一定的價值。使用正則表達式或其他解析從文件中讀取值

例如

文件

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 

我是新來的正則表達式不知道如何寫它。由於

+0

請用簡單的英語無法理解你的問題 – TalentTuner 2013-03-06 05:51:39

+0

的StackOverflow是不是。安迪問解決辦法解釋。向我們展示您嘗試過的內容,並展示一些代碼示例。只有這樣人們纔會幫助你。否則機會是 - 你會得到低估。在旁邊注意 - 我不認爲在你的情況下使用正則表達式是明智的。 – 2013-03-06 06:19:17

+2

這是功課嗎?如果不是,則正則表達式對於這種簡單的文件操作確實是過度的。 – 2013-03-06 06:19:54

回答

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秒。您可以使用DateTime中的AddSeconds(..)方法來完成此操作。

編輯:上述正則表達式解釋說:

  • (\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})直到它再次匹配一些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; 
     } 
    } 
} 

或許,當有人告訴你應該使用正則表達式,他/她在分析DateTime時意味着(而不是做Substring(0,19))。在這種情況下,您可以通過替換它:

var chevyDate = DateTime.Parse(Regex.Match(line, "^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}").Value) 
+0

謝謝奧斯卡獎。爲什麼你不建議不要使用正則表達式以及你認爲我應該用什麼其他解決方案。 – 2013-03-06 06:33:18

+0

@ J.Davidson看到我的編輯。當我說「不使用正則表達式」時,我不僅僅使用正則表達式(逐行閱讀,等等)。),儘管您可以在我的編輯中看到,但您仍然可以使用正則表達式來解析日期。 – 2013-03-06 06:42:03

+0

@ J.Davidson我看到你發佈了一個新問題[here](http://stackoverflow.com/questions/15265237/parsing-extra-characters-from-datetime)。如果我的回答沒有解決您的問題,請隨時在此發表評論。如果確實如此,請接受它作爲答案。 – 2013-03-07 08:00:36

相關問題