如何为CsvReader指定自定义DateOnly日期格式?
解决CsvHelper读取自定义yyyyMMdd格式到DateOnly的问题
要处理自定义日期格式yyyyMMdd转换为DateOnly类型,完全可以通过注解实现,同时也支持全局配置,以下是具体方案:
方法一:使用注解(推荐,针对单个属性)
在DateOnly类型的属性上添加[Format]注解,指定日期格式即可。需要引用CsvHelper.Configuration.Attributes命名空间。
修改后的Foo类代码:
using CsvHelper.Configuration.Attributes; class Foo { public string Title { get; set; } = null!; // 指定自定义日期格式 [Format("yyyyMMdd")] public DateOnly Date { get; set; } }
方法二:全局配置(针对所有DateOnly属性)
如果CSV中所有DateOnly类型的字段都是yyyyMMdd格式,可以通过CsvConfiguration全局设置类型转换器的格式,无需逐个加注解:
var config = new CsvConfiguration(CultureInfo.InvariantCulture) { TypeConverterOptionsCache = new TypeConverterOptionsCache() }; // 为DateOnly类型全局指定格式 config.TypeConverterOptionsCache.Add<DateOnly>(new TypeConverterOptions { Formats = new[] { "yyyyMMdd" } }); using var stringReader = new StringReader(sb.ToString()); // 使用自定义配置初始化CsvReader using var csvReader = new CsvReader(stringReader, config); csvReader.Read(); csvReader.ReadHeader(); while (csvReader.Read()) { var foo = csvReader.GetRecord<Foo>(); }
修正原代码的读取逻辑
原代码中通过lineIndex判断表头的写法容易出错,CsvHelper的标准用法是先读取表头,再循环读取数据行,如上面的代码所示,这样可以避免索引判断的问题。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

