从文件名中提取日期
我有一种情况需要从文件名中提取日期,文件名的一般模式是[filename_]YYYYMMDD[.fileExtension]
例如“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和dotnet framework 3.5
编辑:
我喜欢LC的解决方案和方法。 我用过他的程序
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})(?:\..*)?$
然后,按照该顺序,您捕获的组将分别为年,月和日。
说明:
^
:字符串的开头。
(?:.*_)?
:可选的非捕获组,包含任意数量的字符,后跟下划线。
([0-9]{4})
:包含正好四位数的捕获组。
([0-9]{2})
:包含正好两位数的捕获组。
(?:\..*)?
:可选的非捕获组,包含一个点后跟任意数量的字符。
$
:字符串的结尾。
但是,我要补充一点,如果您确定您的文件名只有一个且只有一个下划线,并且日期跟随下划线,那么您拥有的代码更清晰,可能会比正则表达式略快。 根据预期的输入集,要记住这一点。
只要您确定输入是标准格式,您拥有的代码就足够了。 如果有可能它不会那么你应该为没有下划线的场景添加一些error handling,或者天数/月没有用2位数表示(这会弄乱8个字符的子串数),其次是一个DateTime.TryParse
以确保它是一个真实的日期。
您的其他选择是:
- 正则表达式 :这种明确定义的模式过度杀伤。
- LINQ :使用
SkipWhile
,Skip
,TakeWhile
方法忽略下划线并捕获数字,直到遇到句点。 此查询最终看起来令人困惑,结果需要转换为字符串。 - String.Split :拆分为
{ '_', '.' }
并使用表示日期的数组元素。
这些选项都不会产生比您已经拥有的代码更清晰的代码,性能可能不会更好。
你得到的代码很好,除了你可能想要检查IndexOf
的返回值,以防你遇到没有_的文件,即。
int index = fileName.IndexOf("_"); if (index != -1) return fileName.Substring(index + 1, 8); else ...
如果要检查它是否是有效日期,则可以调用DateTime.TryParseExact