c# - Csvhelper Ingore 仅删除标题列名称,但未删除实际数据
问题描述
我在我的数据库中加载了一个 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"
解决方案
您的代码的问题是您创建了一个匿名类型的实例
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
.
推荐阅读
- php - password_verify 不适用于 Raspberry Pi (PHP7)
- c# - 当用户估计字母不正确时,如何更改 PictureBox?
- javascript - jquery计算账单总额
- css - 删除 Stack Exchange 链接的下划线样式而不闪烁
- php - 转换日期并从字符串日期php中删除时间
- reactjs - 反应显示图像幻灯片
- tensorflow - ValueError:节点变量/分配的输入 0 从变量传递 int32:0 与预期的 int32_ref 不兼容
- mysql - 多行更新为单个查询
- r - r - 从数据框中同一行中的两个点创建线串
- javascript - 模板助手中的异常:TypeError:无法读取未定义的属性“singleType”