我在数据库中加载了一个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"
答案 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
的配置不正确。不知道您的示例为何能运行,因为它不应该编译。
您是否可以修改以下代码行来注册ClassMap
(MyCsvClassMap
而不是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; }
}
}
如果此方法有效,则可能还有其他一些代码会导致此行为。