C# 使用CsvHelper仅将选定列写入CSV文件

C# 使用CsvHelper仅将选定列写入CSV文件,c#,csv,csvhelper,C#,Csv,Csvhelper,我有一个从web服务获取数据的小程序。程序获取JSON响应,将其映射到POCOs,并将对象写入CSV文件(自动映射)。当我要求“所有”数据集中的数据时,它可以完美地工作,但是,如果我(通过OData)这样查询资源:“$select EmpNo,FirstName,LastName”,CSV编写器仍然会将所有列写入CSV标题,例如“EmpNo,FirstName,LastName,Street,Address,City,Age”等,并且只需插入0(如果是int),false(如果是布尔值)或“”(

我有一个从web服务获取数据的小程序。程序获取JSON响应,将其映射到POCOs,并将对象写入CSV文件(自动映射)。当我要求“所有”数据集中的数据时,它可以完美地工作,但是,如果我(通过OData)这样查询资源:“$select EmpNo,FirstName,LastName”,CSV编写器仍然会将所有列写入CSV标题,例如“EmpNo,FirstName,LastName,Street,Address,City,Age”等,并且只需插入0(如果是int),false(如果是布尔值)或“”(如果为字符串)添加到没有数据的列

web服务只正确返回指定的列,所以这不是问题所在。我使用CsvHelper进行对象映射和CSV写入。(但我愿意使用任何可以解决我问题的方法)

我只想将“EmpNo,FirstName,LastName”和列数据写入CSV文件,如果这是我在OData查询中要求的


解决这个问题有什么好办法吗?

如果不知道您使用的是什么代码,很难判断。但我猜,当您编写对象列表时,您使用的模型中有额外的字段,这些字段都是空的,因为您没有通过odata请求它们

如果只需要CsvHelper的子集,则可能需要指定一个
CsvClassMap
,这样可以将现有模型映射到所需的字段中

CsvClassMap上有许多示例:


write方法可能会有一个方法重载,该重载将采用类映射。

您可以创建一个类映射器,并指定要从对象中写入哪些属性(以及如何写入它们!)

然后在编写时,只需指定类映射器

using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.Configuration.RegisterClassMap<NameOfClassMapper>();
    csv.WriteRecords(records);
}
使用(var writer=newstreamwriter(“path\\to\\file.csv”))
使用(var csv=new CsvWriter(writer,CultureInfo.InvariantCulture))
{
csv.Configuration.RegisterClassMap();
csv.书面记录(记录);
}

您可以发布一些代码吗?是的,我使用的模型中包含所有字段。我需要的数据取决于查询字符串中指定的内容(该字符串会一直更改),因此我需要一种在运行时执行此操作的方法。在上面的链接中搜索
运行时映射