.net 使用C#从文件夹路径获取日期字符串

hzbexzde  于 2023-03-20  发布在  .NET
关注(0)|答案(5)|浏览(149)

我有一个List<string>文件夹路径。文件夹路径类似于root/input/YYYY/MM/DD/filename.txt。现在我想从列表中的这个路径文本中选择 * 仅日期 * 部分(YYYY/MM/DD)。需要一些指导。谢谢

List<string> lstPaths = new List<string>() {
  "root/input/2023/03/10/filename1.txt",
  "root/output/2023/03/14/filename2.txt",
}
sxissh06

sxissh061#

遵循Regex模式将对您有所帮助。

var pattern = @"\d{4}/\d{2}/\d{2}";

并使用Regex.Match()进行检查

var dates = lstPaths.Select(p => Regex.Match(p, pattern).Value).ToList();
roejwanj

roejwanj2#

我建议使用DirectoryInfo

using System.IO;

...
string path = "root/output/2023/03/14/filename2.txt";

...

DirectoryInfo dir = new DirectoryInfo(path)?.Parent;

if (int.TryParse(dir?.Name, out int day) &&
    int.TryParse(dir?.Parent?.Name, out int month) &&
    int.TryParse(dir?.Parent?.Parent?.Name, out int year)) {
  // Relevant code for year, month, day 
}

Fiddle

lsmd5eda

lsmd5eda3#

我的解决方案假设路径格式以“date”/“file”格式结尾,并且日期总是由10个字符组成:

var res = lstPaths.ConvertAll(x =>DateTime.Parse(x.Substring(x.LastIndexOf('/')-10,10)));
gt0wga4j

gt0wga4j4#

我刚刚更新了@AVTUNEY的答案来过滤有效日期。不知道什么表现最好。但是这个可以工作并且过滤有效日期。

var pattern = @"\d{4}\/\d{2}\/\d{2}";

var p = "C:/MyData/1234/56/78/MyFolder/2023/03/14/filename2.txt";

var dates = Regex.Matches(p, pattern)
.Cast<Match>().Select(m => m.Value).ToList()
.Where(e => DateTime.TryParse(e, out DateTime temp)).ToList();
isr3a4wc

isr3a4wc5#

这假定日期部分始终位于文件上方的三个文件夹中。

public static void Main()
{
    var paths = new List<string>
    {
        "root/input/2023/03/10/filename1.txt",
        "root/output/2023/03/14/filename2.txt"
    };

    var dates = paths.Select(ExtractDate).ToList();
}

private static DateTime ExtractDate(string s)
{
    var span = s.AsSpan();
    var i = span.LastIndexOf('/');
    var day = span.Slice(i - 2, 2);
    var month = span.Slice(i - 5, 2);
    var year = span.Slice(i - 10, 4);

    return new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));
}

也可以是:

private const string Format = "yyyy/MM/dd";

private static DateTime ExtractDate(string s)
{
    var span = s.AsSpan();
    var i = span.LastIndexOf('/');
    var date = span.Slice(i - 10, 10);

    return DateTime.ParseExact(date, Format.AsSpan(), CultureInfo.InvariantCulture);
}

相关问题