Csvhelper Ingore仅删除标题列名称,但不删除实际数据

时间:2019-06-24 15:10:13

标签: c# .net-core csvhelper

我在数据库中加载了一个csv文件,但文件中没有DbId列。

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

我的csvhelper映射位于MyCsvClass中的Map(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"

2 个答案:

答案 0 :(得分:1)

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

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中一样自动映射忽略了某些字段的所有字段。

答案 1 :(得分:0)

我认为ClassMap的配置不正确。不知道您的示例为何能运行,因为它不应该编译。

您是否可以修改以下代码行来注册ClassMapMyCsvClassMap而不是MyCsvClass)?

csvWriter.Configuration.RegisterClassMap<MyCsvClassMap>();

其余示例工作正常。

尝试以下控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        var allRecords = new List<MyCsvClass>()
        {
            new MyCsvClass { DbId = "1", Data1 = "data1", Data2 = "data2"}
        };
        using (var sw = new StreamWriter("C:\\temp\\test.csv"))
        {
            using (var csvWriter = new CsvHelper.CsvWriter(sw))
            {
                csvWriter.Configuration.RegisterClassMap<MyCsvClassMap>();
                csvWriter.WriteHeader<MyCsvClass>();
                csvWriter.NextRecord();
                csvWriter.WriteRecords(allRecords);
            }
        }
    }

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

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

如果此方法有效,则可能还有其他一些代码会导致此行为。