C# 从文件名中提取日期

C# 从文件名中提取日期,c#,c#-3.0,C#,C# 3.0,我遇到了一种情况,需要从文件名中提取日期,该文件名的一般模式是[filename\uuyyymmdd[.fileExtension] e、 g.“xxx_20100326.xls”或x2v_20100326.csv 下面的程序完成了这项工作 //Number of charecter in the substring is set to 8 //since the length of YYYYMMDD is 8 public static string ExtractDatesFromFil

我遇到了一种情况,需要从文件名中提取日期,该文件名的一般模式是
[filename\uuyyymmdd[.fileExtension]

e、 g.“xxx_20100326.xls”或x2v_20100326.csv

下面的程序完成了这项工作

//Number of charecter in the substring is set to 8 
//since the length of YYYYMMDD is 8

public static string ExtractDatesFromFileNames(string fileName)
{

    return fileName.Substring(fileName.IndexOf("_") + 1, 8);
}
有没有更好的办法实现同样的目标

我基本上是在寻找标准的做法

我正在使用C#3.0和dotnetframework3.5

编辑:

我喜欢信用证的解决方案和回答方式。我用过他的程序

string regExPattern = "^(?:.*_)?([0-9]{4})([0-9]{2})([0-9]{2})(?:\\..*)?$";
string result =  Regex.Match(fileName, @regExPattern).Groups[1].Value;
该函数的输入为:“x2v_20100326.csv”

但是输出是:2010,而不是
20100326
(这是预期的)

任何人都可以帮忙。

我会使用正则表达式,特别是如果文件名中可能有多个下划线的话。然后,您可以捕获年、月、日,并在必要时返回
DateTime
。通过这种方式,您可以确保提取文件名的正确部分,并且它确实匹配您正在搜索的模式

对于模式
[filename.]YYYYMMDD[.fileExtension]
,我的想法如下:

^(?:.*_)?([0-9]{4})([0-9]{2})([0-9]{2})(?:\..*)?$
然后,您捕获的组将按年、月、日的顺序排列

说明:

^
:字符串的开头

(?:.*.\ux)?
:可选的非捕获组,包含任意数量的字符,后跟下划线

([0-9]{4})
:正好包含四位数字的捕获组

([0-9]{2})
:正好包含两个数字的捕获组

(?:\…*)?
:可选的非捕获组,包含一个点,后跟任意数量的字符

$
:字符串的结尾


但是,我要补充一点,如果您确定您的文件名有一个且只有一个下划线,并且日期在该下划线之后,那么您的代码会更干净,并且可能会比正则表达式稍微快一点。基于预期的输入集,需要记住这一点。

只要您确定输入是标准格式,您拥有的代码就足够了。如果可能不是,那么您应该为没有下划线的情况添加一些错误处理,或者天/月不是由2位数字表示的(这将搞乱8个字符的子字符串计数),然后是a以确保它是真实的日期

您的其他选择包括:

  • Regex:对于这样一个定义良好的模式来说,这太过分了
  • LINQ:使用
    SkipWhile
    Skip
    TakeWhile
    方法忽略下划线并捕获数字,直到遇到句点为止。此查询最终看起来很混乱,需要将结果转换为字符串
  • String.Split:在
    {''.'.}
    上拆分,并使用表示日期的数组元素

这些选项都不会产生比您已有的代码更清晰的代码,而且性能可能也不会更好。

您得到的代码很好,但您可能需要检查
IndexOf
的返回值,以防遇到没有u的文件,即

 int index = fileName.IndexOf("_");
 if (index != -1)
     return fileName.Substring(index + 1, 8);
 else
     ...

如果你想检查它是否是一个有效的日期,那么你可以调用
DateTime.TryParseExact

先生,我使用了你的程序,比如字符串regexpatern=“^(?:.*)”([0-9]{4})([0-9]{2})([0-9]{2})(?:\…*)?$”;字符串结果=Regex.Match(文件名@regexpatern).Groups[1]。值;输入为“x2v_20100326.csv”。我得到了2010年的产量。请help@Newbie,他把他的小组分成3个。一年一个,一个月一个,一天一个。参加第2组和第3组。如果您不关心将日期分割成不同的部分,那么可以将正则表达式修改为
^(?:.*.\)([0-9]{8})(?:\…*)?$
如果文件有多个下划线,当前的方法(使用
索引)将失败。而是使用
LastIndexOf
。即使此时您知道只有一个下划线,这也是一个小小的更改,以避免在它发生更改的情况下进行某些调试会话。