gpt4 book ai didi

c# - 如何使用 CSVHelper 编写非平面类的 header ?

转载 作者:行者123 更新时间:2023-12-02 04:22:49 25 4
gpt4 key购买 nike

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; }
}

我正在使用 CSVHelper 将数据写入 CSV 文件。我需要编写带有这样标题的 Class1:

Field1, Field2, Field3, Field4, Field5, Field6

我怎样才能做到这一点?

最佳答案

这是一个老问题,所以您可能已经有了答案。您有几个选择。

选项 1(我知道可行) Documentation

您只需手动写出 CSV 的内容,下面是一些可以帮助您入门的代码,但您需要根据对象内容的存储方式进行修改。

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();
}
}
}

方案2(用过,但不是这样的) Documentation

您的第二个选择是编写一个自定义 CSVMap 来告诉 CSVWriter 如何处理嵌套类。我不确定如何处理该名称,因此您可能需要解决这个问题。

public sealed class Class1CSVMap : CsvClassMap<RemittanceFormModel>
{
public Class1CSVMap()
{
Map(m => m.Field1).Name("Field1");
Map(m => m.Field2).Name("Field2");
Map(m => m.Class2).Name("Field3,Field4").TypeConverter<Class2Converter>();
Map(m => m.Class3).Name("Field5,Field6").TypeConverter<Class3Converter>();
}
}

然后你就有了转换器,一个用于 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;
}
}

选项3(从未使用过) Documentation

您可以执行内联转换器,而不是创建单独的类。我从未尝试过这个,但它应该有效。

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); );
}
}

关于c# - 如何使用 CSVHelper 编写非平面类的 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29168076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com