Использование ShouldSkipRecord для фильтрации диапазонов дат в CSVHelper

#c# #csvhelper

#c# #csvhelper

Вопрос:

Как будет выглядеть фильтрация диапазонов дат с использованием ShouldSkipRecord в csvhelper?

Погуглил кучу, но есть только ссылка на его обратный вызов, и этого недостаточно для меня, чтобы понять, как должен выглядеть синтаксис вызова ShouldSkipRecord. Вы определяете это по столбцам и строкам. В API есть одна короткая строка, и это все.

 if (File.Exists(lastPathName))
            {
                using (var reader = new StreamReader(lastPathName))
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.HasHeaderRecord = false;
                    csv.Configuration.RegisterClassMap<QuotedataMap>();
                    csv.Configuration.ShouldSkipRecord = row => row[0] >= DateTime.Parse("12/12/2019");
                    var records =  csv.GetRecords<Quotedata>();
                    return records;
                }
            }


public sealed class QuotedataMap : ClassMap<Quotedata>
    {
        public QuotedataMap()
        {
            Map(m => m.QuoteDate).Index(0);
            Map(m => m.OpenPrice).Index(1);
            Map(m => m.HighPrice).Index(2);
            Map(m => m.LowPrice).Index(3);
            Map(m => m.ClosePrice).Index(4);
            Map(m => m.DateVolume).Index(5);
        }
    }
  

Итак, как вам фильтровать диапазоны дат? >= <= == ?

Ответ №1:

Переменная row представляет собой массив строк. Таким образом, вы должны преобразовать строку в DateTime перед ее сравнением.

 csv.Configuration.ShouldSkipRecord = row => DateTime.Parse(row[0]) >= DateTime.Parse("12/12/2019");
  

Если ваше выражение будет более сложным, вы могли бы перенести его в отдельный метод.

 csv.Configuration.ShouldSkipRecord = row => FilterDataRange(row[0]);
  

Метод than будет выглядеть следующим образом

 private bool FilterDataRange(string quoteDateAsString)
{
    var date = DateTime.Parse(quoteDateAsString);
    return date >= new DateTime(2019, 12, 1) amp;amp; date <= new DateTime(2019, 12, 31);
}
  

Комментарии:

1. Спасибо за прекрасный пример, и я надеюсь, что его добавили в документацию!