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
。即使此时您知道只有一个下划线,这也是一个小小的更改,以避免在它发生更改的情况下进行某些调试会话。