CSV Helper Mapper:如何在 CSV 写入期间映射列表 属性
CSV Helper Mapper: How to map list property during CSV write
我正在尝试根据其中一个属性为列表的模型生成 CSV 文件。
因此,我的目标是指定一些属性列表并根据这些属性生成字段和值。例如,结果可以是:
Attribute:Brand
Attribute:Brand
Attribute:Size
Attribute:Brand
Test Value1
Test Value2
Test Value3
Test Value4
我尝试使用匿名 objects 或模型 objects,但失败了。
基本上,有两个挑战:
- 拆分列表 属性 到字段。我看到有 Converter 方法,但它 returns string
- 生成 header 名称取决于指定。我看到有一个 Name 方法可以处理替代名称。
有什么idea/advise可以解决吗?使用匿名 object 或模型哪个更好?
注意:我根本不需要看。我只需要保存它。
这是您可以做到的一种方式。
void Main()
{
var records = new List<ProductCsvModel>
{
new ProductCsvModel
{
DirectCosts = 1.1M,
Attributes = new List<dynamic>
{
new { Brand = "Test1" },
new { Season = "Test2" },
new { Brand = "Test3" },
new { Custom = "Test4" }
}
}
};
using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
var first = records.First();
csv.WriteHeader<ProductCsvModel>();
foreach (var item in first.Attributes)
{
PropertyInfo[] properties = item.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
csv.WriteField("Attribute:" + property.Name);
}
}
csv.NextRecord();
foreach (var record in records)
{
csv.WriteRecord(record);
foreach (var item in record.Attributes)
{
PropertyInfo[] properties = item.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
csv.WriteField(property.GetValue(item));
}
}
csv.NextRecord();
}
}
}
public class ProductCsvModel
{
public decimal DirectCosts { get; set; }
public List<dynamic> Attributes { get; set; }
}
我正在尝试根据其中一个属性为列表的模型生成 CSV 文件。 因此,我的目标是指定一些属性列表并根据这些属性生成字段和值。例如,结果可以是:
Attribute:Brand | Attribute:Brand | Attribute:Size | Attribute:Brand |
---|---|---|---|
Test Value1 | Test Value2 | Test Value3 | Test Value4 |
我尝试使用匿名 objects 或模型 objects,但失败了。
基本上,有两个挑战:
- 拆分列表 属性 到字段。我看到有 Converter 方法,但它 returns string
- 生成 header 名称取决于指定。我看到有一个 Name 方法可以处理替代名称。
有什么idea/advise可以解决吗?使用匿名 object 或模型哪个更好?
注意:我根本不需要看。我只需要保存它。
这是您可以做到的一种方式。
void Main()
{
var records = new List<ProductCsvModel>
{
new ProductCsvModel
{
DirectCosts = 1.1M,
Attributes = new List<dynamic>
{
new { Brand = "Test1" },
new { Season = "Test2" },
new { Brand = "Test3" },
new { Custom = "Test4" }
}
}
};
using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
var first = records.First();
csv.WriteHeader<ProductCsvModel>();
foreach (var item in first.Attributes)
{
PropertyInfo[] properties = item.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
csv.WriteField("Attribute:" + property.Name);
}
}
csv.NextRecord();
foreach (var record in records)
{
csv.WriteRecord(record);
foreach (var item in record.Attributes)
{
PropertyInfo[] properties = item.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
csv.WriteField(property.GetValue(item));
}
}
csv.NextRecord();
}
}
}
public class ProductCsvModel
{
public decimal DirectCosts { get; set; }
public List<dynamic> Attributes { get; set; }
}