首页 > 解决方案 > 使用 ShouldSkipRecord 过滤 CSVHelper 中的日期范围

问题描述

在 csvhelper 中使用 ShouldSkipRecord 过滤日期范围会是什么样子?

谷歌搜索了一堆,但只有一个对其回调的引用,这不足以让我了解 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);
        }
    }

那么如何过滤日期范围呢?>= <= == ?

标签: c#csvhelper

解决方案


row 变量是一个字符串数组。因此,您必须在比较之前将 String 转换为 DateTime。

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

如果您的表达式将变得更复杂,您可以将其移至单独的方法。

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

该方法看起来像这样

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

推荐阅读