【发布时间】:2016-10-19 11:59:58
【问题描述】:
我正在尝试将一些可变格式的制表符分隔文件映射到我的班级 Foo:
public class Foo
{
public string A { get; set; }
public int? B { get; set; }
public double? C { get; set; }
}
文件 1:
A B C
string 1 1.0
文件 2:
Bee Sea
1 1.0
当标头格式不变时,使用 CsvClassMap 使用 CsvHelper 很容易做到这一点:
public sealed class FooMap : CsvClassMap<Foo>
{
public FooMap()
{
Map(x => x.A).Name("A");
Map(x => x.B).Name("B");
Map(x => x.C).Name("C");
}
}
但是,当标头格式可变时,这会变得复杂。
- 文件的宽度和高度可能不同。
- 标题顺序不固定。
- 每个文件最多只能定义一次属性。
- 每个属性都可以与各种标题名称相关。
- 标题名称专属于单个属性。
- 并非所有属性都必须在文件中定义。
映射到该对象的最佳方式是什么?
我想我将使用 headers 列上的唯一键填充标题到属性的映射表,然后查找每个标题各自的属性。
目前的调查方向:
public sealed class FooMap : CsvClassMap<Foo>
{
public FooMap()
{
}
public void SetHeaders(List<string> headers)
{
var dictionary = new Dictionary<string, List<string>>();
dictionary.Add("A", new List<string>() { "A", "Aay" });
dictionary.Add("B", new List<string>() { "B", "Bee" });
dictionary.Add("C", new List<string>() { "C", "Sea" });
...
}
}
【问题讨论】:
-
这些文件在某种程度上是否具有相似的格式?例如:所有文件至少包含字段 A 和 B。
-
@raidensan 很可能,但不一定。这些文件将是同一个对象,只是在没有匹配列的地方带有空值。