c# - CSVHELPER 在值为 null 或为空时有条件地忽略写入字段
问题描述
我目前使用 csvhelper 的 csvwriter 将扁平化的 DTO 对象写入 CSV。如果某些字段尚未初始化或在映射器中为空,有没有办法有条件地忽略它们?我看到忽略标志需要一个 boolean ,但是我将如何访问相关字段以对此进行测试。
抱歉,如果这已在其他地方得到回答,但已经搜索了 github 问题和 stackoverflow。
解决方案
对我来说,答案是传入一组字段/列以忽略映射器。这涉及我检查数据集合中所有行上的任何空值,如果是这样,那么我可以完全省略该列。然后我像这样将这个 requiredFields 集合传递给映射器。
public sealed class ApplicationCsvWriterMap : ClassMap<ApplicationDto>
{
public ApplicationCsvWriterMap(List<string> requiredFields)
{
Map(m => m.Id).Index(1).Name("AppId").Ignore(!requiredFields.Contains("id"));
Map(m => m.Status.Text).Index(2).Name("Status").Ignore(!requiredFields.Contains("status"));
Map(m => m.ApplicationTimestamp).Index(3).Ignore(!requiredFields.Contains("applicationTimestamp"));
Map(m => m.LastModified).Index(4).Ignore(!requiredFields.Contains("lastModified"));
然后我可以像这样设置映射器,像这样传递 requiredFields 集合
else if (results.Data is List<Application> applications)
{
csvWriter.Configuration.RegisterClassMap(new ApplicationCsvWriterMap(results.RequiredFields));
csvWriter.WriteRecords(_dtoMapper.MapApplications(applications));
}
推荐阅读
- java - java.lang.UnsatisfiedLinkError:启用 proguard 时找不到 java.lang.String 的实现
- azure-sql-database - 为什么 Azure 数据工厂似乎坚持将 DateTimes 作为字符串插入?
- python - index 必须是单调递增或递减的
- reactjs - 显示 React Skeleton Loader,直到图像完全加载
- sql-server - 如何从系统版本表中获取多个日期
- vba - 如何逐行修改文件
- ios - 拖放过滤原理
- java - 如何从 xml 集成创建 bean
- spring - 角色的 Spring Spel
- css - 为什么 CSS 在 android 上无法正常工作?