2015-07-03 2 views
2

У меня есть серия файлов, которые я пытаюсь проанализировать дату из имени файла. Вот пример из файлов, которые я в настоящее время пытаюсь разобрать:Извлечение даты из файла Где имя файла является переменным

AC SCR063_6.8.15.xlsx 
AC SCR064_6.22.15_REVISED.xlsx 
AccentCare July 2015 Rent Report 06.26.15 Final.xlsx 
AccentCare June 2015 Rent Report 05.26.15 Final.xlsx 

В этих файлах, дата, скорее всего, всегда будет в формате дд.мм.гг или дд.мм.гггга. Я пытался придумать регулярное выражение для соответствия этих дат в пределах строки, и я получил, насколько:

^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$ 

Но из-за изменчивости в имени файла и мое ограниченного знание регулярных выражений, я не уверен, что еще мне нужно сделать, чтобы это регулярное выражение соответствовало всем этим случаям имен файлов. Нужно ли создавать необязательную группу захвата до того, как часть даты регулярного выражения будет соответствовать чему-то, что идет дальше, и необязательной группе захвата после нее, а также исключить Final.xlsx или _REVISED.xlsx и т. Д.?

EDIT: Я также должен отметить, что эти имена файлов также будут содержать информацию о пути обработки в строке, которую я бы оценил, хотя я уверен, что могу просто получить прямое имя файла другим способом, если было бы легче оценить строку, путь.

EDIT 2: Желаемый выход будет 6.8.15 или 06.26.15 и т. Д., Только часть даты, которая находится в формате dd.mm.yy. Таким образом, я мог бы применить его к дате времени в моем приложении.

+0

Что вы желаемый результат? – hungndv

+0

@hungndv см. Мои правки, пожалуйста – Delete

+0

Fyi, ваш формат не 'dd.mm.yyyy.', но' MM.dd.yyyy.' –

ответ

2

так разрешенные форматы M.d.yyyy и M.d.yy (не dd.mm.yyyy, как указано), я хотел бы использовать DateTime.TryParseExact. Например, с этим запросом LINQ:

var fileNames = new string[] { "AC SCR063_6.8.15.xlsx", "AC SCR064_6.22.15_REVISED.xlsx", "AccentCare July 2015 Rent Report 06.26.15 Final.xlsx", "AccentCare June 2015 Rent Report 05.26.15 Final.xlsx" }; 
string[] allowedFormats = { "M.d.yyyy", "M.d.yy" }; 
DateTime[] dates = fileNames 
    .Select(fn => Path.GetFileNameWithoutExtension(fn).Split(' ', '_')) 
    .Select(arr => arr.Select(s => s.TryGetDateTime(null, allowedFormats)) 
         .FirstOrDefault(dt => dt.HasValue)) 
    .Where(nullableDate => nullableDate.HasValue) 
    .Select(nullableDate => nullableDate.Value) 
    .ToArray(); 

, который использует этот удобный метод расширения для разбора строк в DateTime?:

public static DateTime? TryGetDateTime(this string item, DateTimeFormatInfo dfi, params string[] allowedFormats) 
{ 
    if (dfi == null) dfi = DateTimeFormatInfo.InvariantInfo; 
    DateTime dt; 
    bool success = DateTime.TryParseExact(item, allowedFormats, dfi, DateTimeStyles.None, out dt); 
    if (success) return dt; 
    return null; 
} 

Результат является:

08.06.2015 00:00:00 System.DateTime 
22.06.2015 00:00:00 System.DateTime 
26.06.2015 00:00:00 System.DateTime 
26.05.2015 00:00:00 System.DateTime 
+0

Моя ошибка в отношении формата, но да, похоже, это работает потрясающе. Большое спасибо. – Delete

2

Это примерно выглядит правильно, но у вас есть начало проверки строки и конца строки в вашем регулярном выражении (^ в начале и в конце $).

Попробуйте это: (\ D {1,2}) (\ d {1,2}) (\ d {2,4})

+2

Это регулярное выражение также будет соответствовать значению '1.2.123'. Не уверен, что это ожидается. –

+0

Но что, если у вас есть такая строка: «000a95.6.153a9 Final.xlsx» – Fabjan

Смежные вопросы