5

嗨,我有以下代码从文件中读取日期。

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

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

问题是当日期与其他一些文本相关时它会给出错误。例如

\r\n2013-03-03 12:22:02 

我正在尝试更改它,以便代码可以从中删除 "\r\n" 或任何其他文本,并只获取日期部分。

4

3 回答 3

3

你应该使用正则表达式

如果您的日期始终具有相同的格式,您可以轻松编写一个正则表达式,该表达式将从各个行中提取日期并去除每一侧的任何其他内容。为了理解正则表达式应该如下所示:

\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}

此正则表达式过于简化,并且允许0000-00-00 99:99:99可能无效的日期。这取决于您的文件是否可以包含一些可能显示为日期但不是的值。一个更复杂(但更有效)的表达式是(假设 date isYYYY-MM-DD和 not YYYY-DD-MM):

[12]\d{3}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)

这将允许从 1000 年到 2999 年的日期,正确的月份数为 01-12,天数为 01-31,小时数为 00:00:00 到 23:59:59。

但是为了使这个正则表达式更有用,我将把它放在括号中并给它一个名字,这样这些日期就会成为date代码中命名捕获组 ( ) 的一部分,您可以使用它的名称而不是索引来访问它。

Regex rx = "(?<date>[12]\d{3}-(?:0\d|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)).*Test$";
if (rx.Text(line))
{
    Match m = rx.Match(line);
    // no need to use TryParse as regex assures correct formatting
    fordDate = DateTime.Parse(m.Groups["date"]);
}

因此,除了手动检查以我结尾的行之外,Test我还在正则表达式中包含了相同的要求。

于 2013-03-07T07:19:42.913 回答
1

使用此代码替换您需要的符号:

string lineAfterReplace = line.Replace("\t", "").Replace("\r", "").Replace("\n", "");

@J。戴维森 - 使用MSDN Link可能对您来说也更好TryParse

比你有一些这样的代码:

if (DateTime.TryParse(dateString, out dateValue))
{
   /* it was parsed without errors */
}
于 2013-03-07T07:20:41.710 回答
0

改变:

var fordDate = DateTime.Parse(line.Substring(0, 19));

至:

var fordDate = DateTime.Parse(line.Substring(0, 19).Trim());

如果每个 DateTime 字符串单独位于文件的一行中,则最好使用:

var fordDate = DateTime.Parse(line.Trim());
于 2013-03-07T07:26:54.833 回答