您好我有以下代码从文件中读取日期。
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”或任何其他文本,只是获取日期部分。
答案 0 :(得分:3)
如果您的日期始终采用相同的格式,您可以轻松编写一个正则表达式,从单个行中提取日期并删除每一行的其他内容。为了理解正则表达式,应该如下所示:
\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
此正则表达式过于简化,并允许0000-00-00 99:99:99
之类的日期可能无效。这取决于您的文件是否可以包含某些可能与日期相关的值,但不是。一个更复杂(但更有效)的表达式是(假设日期为YYYY-MM-DD
而不是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
结尾,而是在正则表达式中包含了相同的要求。
答案 1 :(得分:1)
使用此代码替换您需要的符号:
string lineAfterReplace = line.Replace("\t", "").Replace("\r", "").Replace("\n", "");
@J。戴维森 - 使用TryParse
MSDN Link
比你有某种代码:
if (DateTime.TryParse(dateString, out dateValue))
{
/* it was parsed without errors */
}
答案 2 :(得分: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());