【问题标题】:Mapping and writing a custom class to csv将自定义类映射并写入 csv
【发布时间】:2019-01-21 10:22:26
【问题描述】:

我正在尝试使用 CsvHelper 将一些数据输出到 CSV 文件。以下CSVExport 的每个实例对应一行。每行可能有不同数量的列,因为Stores 的长度可能不同。该映射适用于前三个属性(CurrencyCode、StoreCode、OutletTradingName),但我遇到了List<Stores> Stores 的问题。

我目前收到以下错误消息,代码如下:

{"Converting IEnumerable types is not supported for a single field. If you want to do this, create your own ITypeConverter and register it in the TypeConverterFactory by calling AddConverter."}

关于如何解决此问题的任何建议?

写入 csv 文件的 C# 代码:

var memoryStream = new System.IO.MemoryStream();
var streamWriter = new System.IO.StreamWriter(memoryStream);
using (var csvWriter = new CsvWriter(streamWriter))
{
    csvWriter.Configuration.RegisterClassMap<CSVExportMap>();
    csvWriter.WriteRecords(csvExport);
    streamWriter.Flush();
}

映射:

public sealed class CSVExportMap : CsvClassMap<CSVExport>
{
    public CSVExportMap()
    {
        Map(m => m.CurrencyCode).Name("Outlet Currency").Default("Not available.");
        Map(m => m.StoreCode).Name("Store No.").Default("Not available.");
        Map(m => m.OutletTradingName).Name("Outlet Trading  Name").Default("Not available.");

        // if I comment this line out, I get no error but no list of stores
        Map(m => m.Stores).ConvertUsing( row => new List<Stores> { row.GetRecord<Stores>() } );
    }
}

我正在尝试输出到 CSV 文件的类:

public class CSVExport
{
    public string StoreCode { get; set; }
    public string OutletTradingName { get; set; }
    public string CurrencyCode { get; set; }
    public List<Stores> Stores { get; set; }
}

public class Stores
{
    public string Name { get; set; }
    public string StoreCode { get; set; }
    public string ID { get; set; }
}

【问题讨论】:

    标签: c# csv export-to-csv csvhelper


    【解决方案1】:

    确保您拥有最新版本的 CsvHelper。 (目前是 v7.1.1)我尝试了你的代码并替换了这一行:

    Map(m => m.Stores).ConvertUsing( row => new List<Stores> { row.GetRecord<Stores>() } );
    

    用这个:

    Map(m => m.Stores).ConvertUsing(row =>
    {
        var list = new List<Store>();
        list.Add(row.GetField<Store>(2));
        return list;
    });
    

    或更短(单线):

    Map(m => m.Stores).ConvertUsing(row => new List<Store> {row.GetField<Store>(2)});
    

    并且程序运行没有问题。 GetField&lt;Store&gt;(2) 中的索引是从零开始的,您的 Store 类有 3 个成员。我只是将您的 Stores 类重命名为 Store(仅用于命名约定!它与商店列表属性混淆!抱歉)

    我使用了这个技巧: Writing a collection that contains collections

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多