【问题标题】:CSVHelper: One Row, multiple classmapsCSVHelper:一行,多个类图
【发布时间】:2020-08-12 17:33:58
【问题描述】:

我有一行作为多个类的组合。此后,这些类代表一个嵌套的聚合对象。 例如:

(header)product_name、product_sku、product_description、promotion_date、promotion_price

(数据)xxx,1234,“伟大的产品”,202 年 12 月 4 日,3.41 美元

我想读取 Product 对象中的前 3 列,然后将其他两个列读取到 Promotion 对象中。 我可以用两张地图做到这一点吗?我可以在 classMap 中的两个类之间创建视图吗?

【问题讨论】:

  • 显示一些代码,无需更多,我假设您可以使用 LINQ 加入和聚合您的数据,然后为 csvhelper 提供一个匿名对象。

标签: csvhelper


【解决方案1】:

你可以用几张地图来做

public class Program
{
    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        using (var writer = new StreamWriter(stream))
        using (var reader = new StreamReader(stream))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            writer.WriteLine("product_name,product_sku,product_description,promotion_date,promotion_price");
            writer.WriteLine("xxx,1234,great product,12/4/202,$3.41");
            writer.Flush();
            stream.Position = 0;

            csv.Configuration.RegisterClassMap<TransactionMap>();

            var records = csv.GetRecords<Transaction>().ToList();
        }
    }
}

public class TransactionMap : ClassMap<Transaction>
{
    public TransactionMap()
    {
        References<ProductMap>(m => m.Product);
        References<PromotionMap>(m => m.Promotion);
    }
}

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Map(m => m.Name).Name("product_name");
        Map(m => m.Sku).Name("product_sku");
        Map(m => m.Description).Name("product_description");
    }
}

public class PromotionMap : ClassMap<Promotion>
{
    public PromotionMap()
    {
        Map(m => m.Date).Name("promotion_date");
        Map(m => m.Price).Name("promotion_price");
    }
}

public class Transaction
{
    public Product Product { get; set; }
    public Promotion Promotion { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public string Sku { get; set; }
    public string Description { get; set; }
}

public class Promotion
{
    public DateTime Date { get; set; }
    public string Price { get; set; }
}

或者一张地图

public class Program
{
    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        using (var writer = new StreamWriter(stream))
        using (var reader = new StreamReader(stream))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            writer.WriteLine("product_name,product_sku,product_description,promotion_date,promotion_price");
            writer.WriteLine("xxx,1234,great product,12/4/202,$3.41");
            writer.Flush();
            stream.Position = 0;

            csv.Configuration.RegisterClassMap<TransactionMap>();

            var records = csv.GetRecords<Transaction>().ToList();
        }
    }
}

public class TransactionMap : ClassMap<Transaction>
{
    public TransactionMap()
    {
        Map(m => m.Product.Name).Name("product_name");
        Map(m => m.Product.Sku).Name("product_sku");
        Map(m => m.Product.Description).Name("product_description");
        Map(m => m.Promotion.Date).Name("promotion_date");
        Map(m => m.Promotion.Price).Name("promotion_price");
    }
}

public class Transaction
{
    public Product Product { get; set; }
    public Promotion Promotion { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public string Sku { get; set; }
    public string Description { get; set; }
}

public class Promotion
{
    public DateTime Date { get; set; }
    public string Price { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多