【问题标题】:Writing only selected columns to CSV-file using CsvHelper使用 CsvHelper 仅将选定的列写入 CSV 文件
【发布时间】:2015-07-31 14:11:30
【问题描述】:

我有一个从 Web 服务获取数据的小程序。该程序获取 JSON 响应,将其映射到 POCO 并将对象写入 CSV 文件(自动映射)。当我询问数据集中的“所有”数据时,它工作得很好,但是,如果我像这样查询资源(通过 OData):“$select EmpNo,FirstName,LastName”,CSV 编写器仍将写入所有列到 CSV 标头,例如“EmpNo、FirstName、LastName、Street、Address、City、Age”等,只需在没有数据的列中插入 0(如果是 int)、false(如果是布尔值)或“”(如果是字符串)。

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

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

有解决这个问题的好主意吗?

【问题讨论】:

  • 你能发布一些你的代码吗?

标签: c# csv csvhelper


【解决方案1】:

如果不知道您使用的确切代码,就很难分辨。但我的猜测是,当您编写对象列表时,您正在使用其中包含额外字段的模型,这些字段都是空的,因为您没有通过 odata 请求它们。

如果您只需要 CsvHelper 的子集,您可能需要指定 CsvClassMap<T>,这会将您现有的模型映射到您想要的字段

这里有很多关于 CsvClassMap 的示例:http://joshclose.github.io/CsvHelper/

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

【讨论】:

  • 是的,我正在使用包含所有字段的模型。我想要什么数据取决于查询字符串中指定的内容(一直在变化),所以我需要一种在运行时执行此操作的方法。
  • 在上面的链接中搜索Runtime Mapping
【解决方案2】:

您可以创建一个 ClassMapper 并指定要写入对象的哪些属性(以及您希望如何编写它们!)
https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/mapping-properties

那你去写的时候指定ClassMapper就行了

using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.Configuration.RegisterClassMap<NameOfClassMapper>();
    csv.WriteRecords(records);
}

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多