SmartDeveloping Ответов: 2

Разбирать по дате имени


Поэтому мне нужно разобрать дату имени файла. До сих пор, например, у меня есть файл, и дата
Accounts_2012017
Проблема, которая у меня есть на данный момент, заключается в том, что формат даты что-то вроде "M/dd/yyyy" , и поэтому каждый раз, когда я использую ParseExact,
Я получаю ошибку, что строка не является допустимой датой-временем, даже если я делаю "ММ/ДД/гггг". Какие еще у меня есть варианты, чтобы выбрать эту дату?

Вышеприведенная дата гласит: 1 февраля 2017 года

Что я уже пробовал:

string temp = filename.Replace(".txt", "").Substring(filename.LastIndexOf('_') + 1);
           DateTime extracted = DateTime.ParseExact(temp, "Mddyyyy", System.Globalization.CultureInfo.InvariantCulture);

Dave Kreskowiak

Быстрым решением было бы получить строку даты, проверить ее длину, а затем переключиться на соответствующую строку синтаксического анализа, одну для однозначных месяцев и одну для двухзначных месяцев.

На самом деле проблема в ваших данных. В нормализованном формате у вас будет одинаковое количество цифр для всех чисел месяца , дня и года. Это означает, что ведущие нули в значениях заполняют необходимое количество цифр для поддержания согласованности данных.

SmartDeveloping

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

[no name]

Используйте оператор If для проверки длины temp и добавьте "0" в начало строки, Если длина не равна 8. Если кто-то, кто дает вам эти имена, не собирается норамлизировать их для вас, вам придется сделать это самостоятельно.

[no name]

Вы не очень хорошо прочитали комментарий, не так ли?

SmartDeveloping

Извините, я понимаю, что вы имеете в виду.

2 Ответов

Рейтинг:
6

Karthik_Mahalingam

попробовать это
это будет работать для "MMddyyyy" и "Mddyyyy"

string filename = "Accounts_2012017.txt";
           string temp = filename.Replace(".txt", "").Substring(filename.LastIndexOf('_') + 1);
           string format = (temp.Length == 7) ? "Mddyyyy" : "MMddyyyy";
           DateTime extracted = DateTime.ParseExact(temp, format, System.Globalization.CultureInfo.InvariantCulture);


SmartDeveloping

Большое спасибо, я смог заставить его работать с чем-то подобным.

Karthik_Mahalingam

хороший,

Рейтинг:
2

#realJSOP

Согласно опубликованному вами примеру имени файла, ваша строка формата неверна. Это должно быть "ггггмдд". Кстати, если еще не поздно изменить его, было бы лучше, если бы вы использовали двузначный месяц. Таким образом, нет никакой путаницы в том, что такое дата, и ваш синтаксический анализ всегда будет работать.

Лично я не думаю, что вы сможете надежно разобрать дату, потому что вы позволяете месяцу быть представленным одной цифрой. Чтобы смягчить этот аспект имени файла, вы можете проверить длину строки, представляющей дату, и если она меньше 8, добавить к ней ноль. В этот момент Вы можете изменить строку формата на "MMddyyyy", и она будет правильно разбираться каждый раз (при условии, конечно, что день всегда представлен двумя цифрами).

FWIW, вы также должны рассмотреть возможность разбиения этого утверждения на отдельные части, чтобы вам было легче исправить дату (и обрабатывать ошибки).


SmartDeveloping

Ошибка: строка не была распознана как допустимая Дата-Время. Не уверен, как "yyyyMdd" поможет, потому что 2017 год уже подходит к концу. Дата - 1 февраля 2017 года.

#realJSOP

Обновил свой ответ.

SmartDeveloping

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