csvhelper - CSV Helper 中列的完全限定名称(避免列名重复并确保幂等性)

我需要 CSV 的标题来表示对象上属性的完全限定名称/路径,以确保在转换为 csv 时具有幂等性。

一个例子:如果一个对象有多个相同类型的属性,我想完全限定名称。考虑以下结构:

public class Foo
{
    public DateTime? MyDateTime { get; set; }
    public string? MyDescription { get; set; }
}

public class MyContainer
{
    public Foo? MyFirstUsage { get; set; }
    public Foo? MySecondUsage { get; set; }
}

在正常情况下,csv 助手会将“MyContainer”的标题创建为“MyDateTime,MyDescription,MyDateTime,MyDescription”

我想避免这种情况并限定名称导致“MyFirstUsageMyDateTime,MyFirstUsageMyDescription,MySecondUsageMyDateTime,MySecondUsageMyDescription”的标题

TL;DR:如何覆盖 CSVHelper 扁平化对象以写入标题,以便标题代表属性的完全限定路径,从而(理论上)确保幂等性?

编辑:我创建了一个小示例应用程序,希望能更好地解释这个问题:https://github.com/JimHume/CsvHelperColumnNames/tree/main

Edit2:我忘了提到一个要求是不能通过映射来完成——它需要动态完成。

回答1

更新:发现您可以在配置中使用 ReferenceHeaderPrefix

void Main()
{
    var mySample = new MyContainer
    {
        MyFirstUsage = new Foo
        {
            MyDateTime = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
            MyDescription = "This is the first usage"
        },
        MySecondUsage = new Foo
        {
            MyDateTime = DateTime.UtcNow.AddDays(1),
            MyDescription = "This is the second usage"
        }
    };

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        ReferenceHeaderPrefix = (args) => $"{args.MemberName}",
    };

    using (var csvWriter = new CsvWriter(Console.Out, config))
    {
        csvWriter.WriteRecords(new[] { mySample });
    }
}

// You can define other methods, fields, classes and namespaces here
public class Foo
{
    public DateTime? MyDateTime { get; set; }
    public string MyDescription { get; set; }
}

public class MyContainer
{
    public Foo MyFirstUsage { get; set; }
    public Foo MySecondUsage { get; set; }
}

相似文章

r - 在 R 中加载 csv 数据框时添加列

我们正在Airbnb内部为我们的大学开展一个项目。我们加载了许多不同城市的列表,并希望将所有数据加载到一个相互绑定的数据框中。但是,我们解决了这个问题。现在我们需要为每个数据集添加一个列,说明它属于哪...

最新文章