gpt4 book ai didi

c# - CSVHelper:使用 IndexAttribute 写出一个空字段

转载 作者:行者123 更新时间:2023-12-05 04:00:13 24 4
gpt4 key购买 nike

我们有一个固定的输出记录格式,其中所有字段都是竖线分隔的。布局是固定的,但必填字段没有按顺序排列(这无法更改,因为客户使用的是现有布局)。我们可以使用 CSVHelper 和 Index 属性写出空白字段,例如 [Index(1)]、[Index(4)]、[Index(7)] 会产生如下内容:

"Field1Value,,,Field2Value,,,Field3Value"?

我们最终可能会添加缺失的字段,但必须分阶段考虑(因为对客户的影响),但希望能够创建具有所需字段值的最小输出记录格式。

我们正在努力使用 .Net Core 2.2/C#。

我查看了几个支持使用 [Column(xx)] 和 [FieldOrder(xx)] 等数据属性装饰属性的 nuget 和其他库,但最终选择了 CSVHelper,因为它看起来很强大且被广泛使用。

public class Person
{
[Index(1)]
public string Name { get; set; }
[Index(4)]
public short Age { get; set; }
[Index(7)]
public string StreetAddress { get; set; }
}

static void Main(string[] args)
{
var records = new List<Person>
{
new Person { Name = "Jon Doe", Age = 100, StreetAddress = "123 Market Place" }
};

using (var writer = new StreamWriter("C:\\Projects\\CsvHelperDemo\\file.csv"))
using (var csv = new CsvWriter(writer))
{
csv.WriteRecords(records);
}
}

预期:

Name,,,Age,,,StreetAddress
Jon Doe,,,100,,,123 Market Place

实际:

Name,Age,StreetAddress
Jon Doe,100,123 Market Place

最佳答案

如果这是一个选项,我只会将属性添加到 Person 类中。如果它们未被填充,那么您将只有列名称,它们下面没有数据。这有点奇怪,但与具有“空白”列名和空列没有太大区别。

但是如果你想得到你所描述的准确结果,你可以这样做:

public class Person
{
[Index(0)]
public string Name { get; set; }

[Index(3)]
public short Age { get; set; }

[Index(6)]
public string StreetAddress { get; set; }

#region For spacing only

[Name("")]
[Index(1)]
public string Abc { get; set; }

[Name("")]
[Index(2)]
public string Xyz { get; set; }

[Name("")]
[Index(4)]
public string Foo { get; set; }

[Name("")]
[Index(5)]
public string Blarg { get; set; }

#endregion
}

我用了假名。您可以改用真实的。没关系,因为列标题将为空白。

一个缺点是您可以开始填充您现在不使用的那些额外属性之一,然后该列将在没有标题的情况下填充,除非您记得返回并删除 [Name(""}] 属性。

您还可以在不更改 Person 的情况下创建一个单独的继承类。这样你就可以填充 Person,然后将其映射到继承的类并将其用于编写:

public class PersonWithExtraFields : Person
{
[Name("")]
[Index(1)]
public string Abc { get; set; }

[Name("")]
[Index(2)]
public string Xyz { get; set; }

[Name("")]
[Index(4)]
public string Foo { get; set; }

[Name("")]
[Index(5)]
public string Blarg { get; set; }
}

这是描述如何使用 CsvHelper 执行此操作的字面答案。这是一个更简单的方法:

public class PersonCsvWriter
{
public void Write(List<Person> people, string path)
{
using (var file = new StreamWriter(path))
{
file.WriteLine("Name,,,Age,,,StreetAddress");
people.ForEach(p => file.WriteLine($"{p.Name},,,{p.Age},,,{p.StreetAddress}"));
}
}
}

关于c# - CSVHelper:使用 IndexAttribute 写出一个空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482003/

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