C# 如何使用CSVHelper编写非平面类的头文件?
我正在使用C# 如何使用CSVHelper编写非平面类的头文件?,c#,csv,csvhelper,C#,Csv,Csvhelper,我正在使用CSVHelper将数据写入CSV文件。 我需要用如下标题编写Class1: 场1、场2、场3、场4、场5、场6 我怎样才能做到这一点?这是一个老问题,所以你可能已经有了答案。你有几个选择 选项1(我知道它会起作用) 您只需要手动写出CSV的内容,下面是一些代码,可以让您开始,但您需要根据对象内容的存储方式进行修改 public class Class1 { [CsvField(Name = "Field1")] public int Field1 { get; set
CSVHelper
将数据写入CSV文件。
我需要用如下标题编写Class1:
场1、场2、场3、场4、场5、场6
我怎样才能做到这一点?这是一个老问题,所以你可能已经有了答案。你有几个选择 选项1(我知道它会起作用) 您只需要手动写出CSV的内容,下面是一些代码,可以让您开始,但您需要根据对象内容的存储方式进行修改
public class Class1
{
[CsvField(Name = "Field1")]
public int Field1 { get; set; }
[CsvField(Name = "Field2")]
public int Field2 { get; set; }
[CsvField(Ignore = true)]
public Class2 Class2 { get; set; }
[CsvField(Ignore = true)]
public Class3 Class3 { get; set; }
}
public class Class2
{
[CsvField(Name = "Field3")]
public int Field3 { get; set; }
[CsvField(Name = "Field4")]
public int Field4 { get; set; }
}
public class Class3
{
[CsvField(Name = "Field5")]
public int Field5 { get; set; }
[CsvField(Name = "Field6")]
public int Field6 { get; set; }
}
选项2(使用过,但不是这样的)
第二个选项是编写一个定制的CSVMap
,告诉CSVWriter如何处理嵌套类。我不知道该如何处理这个名字,所以你可能必须解决这个问题
using (var stream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(stream))
using (var csv = new CsvWriter(streamWriter))
{
// Write out header
csv.WriteField("Field1");
csv.WriteField("Field2");
csv.WriteField("Field3");
csv.WriteField("Field4");
csv.WriteField("Field5");
csv.WriteField("Field6");
// Write out end line
csv.NextRecord();
//Pseudocode
foreach (var item in Class1Collection)
{
csv.WriteField(item.Field1);
csv.WriteField(item.Field2);
csv.WriteField(item.Class2.Field3);
csv.WriteField(item.Class2.Field4);
csv.WriteField(item.Class3.Field5);
csv.WriteField(item.Class3.Field6);
// Write out end line
csv.NextRecord();
}
}
}
选项3(从未使用过)
您可以使用内联转换器,而不是创建单独的类。我从来没有试过这个,但它应该有用
public class Class2Converter : DefaultTypeConverter
{
public override string ConvertToString(TypeConverterOptions options, object model)
{
var result = string.Empty;
var classObject = model as Class2;
if (classObject != null)
{
result = string.Format("{0},{1}", classObject.Field3, classObject.Field4);
}
return result;
}
}
公共密封类ClassCSVMAP:CsvClassMap
{
公共类别CSVMAP()
{
Map(m=>m.Field1).Name(“Field1”);
Map(m=>m.Field2).Name(“Field2”);
Map(m=>m.Class2).Name(“Field3,Field4”).ConvertUsing(row=>string.Format(“{0},{1}”,row.Field3,row.Field4”);
Map(m=>m.Class3.Name(“Field5,Field6”).ConvertUsing(row=>string.Format(“{0},{1}”,row.Field5,row.Field6););
}
}
您只需添加额外的公共属性即可访问Class2和Class3的方法。然后将属性应用于这些属性。
public class Class2Converter : DefaultTypeConverter
{
public override string ConvertToString(TypeConverterOptions options, object model)
{
var result = string.Empty;
var classObject = model as Class2;
if (classObject != null)
{
result = string.Format("{0},{1}", classObject.Field3, classObject.Field4);
}
return result;
}
}
public sealed class Class1CSVMap : CsvClassMap<Class1>
{
public Class1CSVMap()
{
Map(m => m.Field1).Name("Field1");
Map(m => m.Field2).Name("Field2");
Map(m => m.Class2).Name("Field3,Field4").ConvertUsing(row => string.Format("{0},{1}", row.Field3, row.Field4); );
Map(m => m.Class3).Name("Field5,Field6").ConvertUsing(row => string.Format("{0},{1}", row.Field5, row.Field6); );
}
}