2016-11-10 66 views
1

我正试图在单个目录中查找具有最高日期的文件。问题是日期附加到文件名。我正在使用下面的代码来尝试拉出最大日期,但遇到了ParseExact的麻烦。使用ParseExact从文件名获取日期

//Gather all of the files in the local directory 
var files = Directory.EnumerateFiles(r.getLeadLocalFile()); 
returnDateTime = files.Max(f => DateTime.ParseExact(f, "MMddyyXXXX.csv", CultureInfo.InvariantCulture)); 

我不断收到以下错误:

String was not recognized as a valid DateTime. 

我可以告诉大家,文件路径的值被传递,因为“F”的值低于:

\\\\vamarnas02\\users\\meggleston\\User Files\\Leads\\110716ENH9.csv 

ENH9的值可能会因文件而异。

如何从我的文件名获取DateTime?

+0

你有关于这些文件是如何创造了一些控制......可以添加一个'_'日期和名字,比如'110716_ENH9.csv'之间? – Hackerman

+0

难道你不能简单地从文件名字符串的前6个字符? –

+0

我没有文件名的控制权,我不知道如何用substring方法获得最大日期时间。 –

回答

0

您需要在分析之前拆分日期文本。下面的代码片段应该有所帮助。

假设变量f是文件名。

DateTime.ParseExact(f.Substring(f.LastIndexOf("\\") + 1, 6), "MMddyy", CultureInfo.InvariantCulture); 
+0

这样做。我想我已经看了太久了。感谢您帮助像我一样的虚拟人物。 –

+0

没问题快乐帮 – user2818985

0

尝试仅传递文件名“110716ENH9.csv”而不是文件的完整路径。

MSDN DateTime.ParseExact Documentation

Converts the specified string representation of a date and time to its DateTime equivalent using the specified format and culture-specific format information. The format of the string representation must match the specified format exactly.

从您提供的是什么,你的格式不完全匹配。

- 只传递文件名的前6个字符到ParseExact函数并将您的格式修改为“MMddyy”。

+0

我已将我的代码更改为以下内容,但仍收到相同的错误: 'returnDateTime = files.Max(f => DateTime.ParseExact(Path。GetFileNameWithoutExtension(f),“MMddyyXXXX”,CultureInfo.InvariantCulture));' –

+0

日期格式中没有通配符。你需要对文件名进行子串处理。由于您知道日期格式只需要前6个字符,因此只能将文件名的前6个字符传递给ParseExact函数,并将您的格式修改为“MMddyy”。 – padotj

2

这是另一种方法。无需分开任何东西。但是一个错误的文件名(如你目前的做法)会毁了它:

//Gather all of the files in the local directory 
var files = new DirectoryInfo(r.getLeadLocalFile()).GetFiles("*.csv"); 
returnDateTime = files.Max(f => DateTime.ParseExact(f.Name.Substring(0, 6), "MMddyy", CultureInfo.InvariantCulture)); 
+0

打我吧。这应该是正确的答案 –

0

你真的需要在这里使用ParseExact吗?因为你似乎只需要获取Int32值并在之后进行比较。
所以另一种方法:你可以从提供的路径中提取一些正则表达式的日期部分。例如,您可以用这一个:

\\\d{6} // 2 slashes and 6 digits. I'm not an expert in regex, but seems that this one is enough for your task. 

,又重新修整\\部分。因此,像这样的循环:

private string ExtractDateFromFilename(string filename) { 
     var m = Regex.Match(filename, @"\\\d{6}"); 
     if (!string.IsNullOrEmpty(m.Value)) 
      return m.Value.Substring(1); 
     return ""; 
    } 
+0

如果性能很重要,我不会使用RegEx,IndexOf会产生更快的执行时间 – user2818985

+0

@ user2818985,当然你是对的,正则表达式在大字符串上比较慢(与字符串方法相比),但是如果你今后需要改变一些条件或者有一些复杂的比较逻辑。对于小字符串,而不是数百万次的比较,它不会有明显的差异(抱歉,没有现在的这个样本的证明样本,也许会稍后添加一些)。 – 0x49D1