Поиск в таблице с налетом неопределенности

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Доброго дня!
Есть таблица, в одном из столбцов которой собраны даты.
Даты могут быть в формате datetime h.M.yyyy, а могут быть без года, т.е. уже как бы и не в формате datetime.
Нужно найти даты, соответствующие текущему дню-месяцу, т.е., если говорить про сегодня то 21.1.
Пробовал искать через Contain, однако в выборку, помимо нужных, попадают еще и 21.10, и 21.11 и 21.12, что не есть хорошо.
Открыл «Конструктор регулярных выражений», подобрал регулярку 21\.1[^\d]\.* — все пучком, находит только нужные строки, но...
В PM регулярка не срабатывает и все. В конструкторе работает, в notepad++ работает, а в PM — болт. Ищу так:

C#:
var source = project.Tables["source"];//входная таблица
var dest = project.Tables["dest"];//выходная таблица 
Regex regex = new Regex(@"21\.1[^\d]\.*");//регулярка

for (int i=0; i<source.RowCount; i++)
    {
        string cell = source.GetCell(3, i);
        if(regex.IsMatch(cell))
        {           
            dest.AddRow(source.GetRow(i).ToArray());           
        }
    }
Буду очень признателен за подсказку.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 294
Баллы
113

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63

orka13

Client
Регистрация
07.05.2015
Сообщения
2 165
Благодарностей
2 167
Баллы
113
Через регулярку это костыль, лучше бы через парсинг даты, но может так и проще. Замените строку с регуляркой на:
C#:
Regex regex = new Regex(@"^21\.1(\.|$)");//регулярка
 
  • Спасибо
Реакции: semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Через регулярку это костыль, лучше бы через парсинг даты
Orka13, мне и самому регулярка показалась не совсем уместной, но вариантов с DateTime вчера в голову не пришло. Спасибо за мнение, оно подтолкнуло еще покумекать ))
В процессе изысканий выяснил, что при парсинге в DateTime строки формата d.M ("21.1") получаем DateTime 21.1.2020. Т.е., если год отсутствует, считается что это текущий год.
В случае же присутствия года (например 21.1.1987), в DateTime получаем соответственно 21.1.1987.
Таким образом сравнение двух дат опять не подходит. Но..
Если же перегнать спаршенное значение обратно в строку — вуаля, можно привести строки к одинаковому виду и корректно их сравнить.
Окончательный вариант получился такой:
C#:
var source = project.Tables["source"];//входная таблица
var dist = project.Tables["dist"];//выходная таблица

//получаем в строку текущие день-месяц
string dtnow = System.DateTime.Now.ToString("d.M");

//в цикле ищем строки, в которых ячейка содержит значение dtnow
lock (SyncObjects.TableSyncer)
{
    for (int i=0; i<source.RowCount; i++)
    {
        //получаем i-тую ячейку таблицы
        string cell = source.GetCell(3, i);
      
        // если cell пуста, переходим к следующей итерации
        if (string.IsNullOrEmpty(cell))continue;
      
        //перегоняем cell в DateTime
        DateTime celldt = DateTime.Parse(cell);
        //И обратно в строку формата d.M
        string dtcheck = celldt.ToString("d.M");
      
        //если строковые переменные равны, сохраняем строку в выходную табл.
        if(dtnow == dtcheck)
        {     
            dist.AddRow(source.GetRow(i).ToArray());         
        }
    }
}
Буду признателен всем за мнения, дополнения и критику.

P.S. Orka13, за регулярку спрасибо — она работает.
 
  • Спасибо
Реакции: orka13

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)