首页 > 解决方案 > Csvhelper Ingore 仅删除标题列名称,但未删除实际数据

问题描述

我在我的数据库中加载了一个 csv 文件,其中 DbId 列不在文件中。

我想将其导出回原始格式。

我的 csvhelper 映射MyCsvClassMap(m => m.DbId).Ignore();

标题很好,但输出数据仍然显示 DbId 列的值: https ://dotnetfiddle.net/XP2Vvq

using CsvHelper.Configuration;
using System;
using System.IO;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var record = new { DbId = 1, Data1 = "aaa", Data2 = "bbb" };

            using (var sw = new StreamWriter(@"c:/temp/testt.csv"))
            {
                using (var csvWriter = new CsvHelper.CsvWriter(sw))
                {
                    csvWriter.Configuration.RegisterClassMap<MyCsvClassMap>();
                    csvWriter.WriteHeader<MyCsvClass>();
                    csvWriter.NextRecord();
                    csvWriter.WriteRecord(record);
                }
            }
        }
    }

    public class MyCsvClassMap : ClassMap<MyCsvClass>
    {
        public MyCsvClassMap()
        {
            AutoMap();
            Map(m => m.DbId).Ignore();
        }
    }

    public class MyCsvClass
    {
        public int DbId { get; set; }
        public string Data1 { get; set; }
        public string Data2 { get; set; }      
    }   
}

输出是

Data1, Data2
1, "aaa", "bbb"

当我期待

Data1, Data2
"aaa", "bbb"

标签: c#.net-corecsvhelper

解决方案


您的代码的问题是您创建了一个匿名类型的实例

var record = new { DbId = 1, Data1 = "aaa", Data2 = "bbb" };

代替

var record = new MyCsvClass { DbId = 1, Data1 = "aaa", Data2 = "bbb" };

标头很好,因为您将正确的类传递给泛型方法的类型参数。

csvWriter.WriteHeader<MyCsvClass>();

编辑

要将数据库实体导出为 CSV,您不需要任何中间类。您可以将实体直接写入 CSV,并ClassMap<T>帮助您控制哪些值以及如何将其序列化为 CSV。如果您的实体类是MyDbEntity,那么只需注册自定义映射ClassMap<MyDbEntity>,您可以在其中自动映射所有字段,忽略某些字段,就像您在MyCsvClassMap.


推荐阅读