首页 > 解决方案 > 有没有更好的方法将多个头文件从输入文件映射到类模型?

问题描述

我从客户端收到各种输入文件(CSV、Excel),这些文件都输入相同的数据模型。客户端都为其数据使用不同的标头,因此我需要将标头选项映射到数据模型中的单个字段。

示例:我在类模型中有一个字段 Company,我需要读取的可能标头可能是 Firm、Company、CompanyName 或 Business。

现在,我正在使用一个大的重复 switch 语句来根据我看到的标题来处理这个问题。这是有效的,但它真的很丑陋和重复。

var map = new Dictionary<string, string>();
var colKey = "";

switch (columnName.ToUpper())
{
    case "FIRM":
    case "COMPANY":
    case "COMPANYNAME":
    case "BUSINESS":
        colKey = "COMPANY";
        if (!map.ContainsKey( colKey ))
        {
            map.Add( colKey, columnName);
        }
        break;
    case "ADDRESS1":
    case "LINE1":
        colKey = "LINE1";
        if (!map.ContainsKey ( colKey ))
        {
            map.Add( colKey, columnName);
        }
        break;
}

最终,我需要从可能具有各种标题的 DataRows 中读取数据到数据模型中。上面的代码给了我一个字典,即使数据的标题可能与我的数据模型不匹配,我也可以使用它来通过已知名称访问数据。

有没有更好的方法将这些可能的标头选项映射/解析到数据模型字段中?

标签: c#

解决方案


由于 columnMappings 是预定义的,我们可以有一个静态字典,其中所有可能的列名作为键,colKey 作为值,如下所示:

  static readonly Dictionary<string, string> _columnMappings = new Dictionary<string, string>();
  static ClassName() //static constructor
  {
     _columnMappings.Add("FIRM", "COMPANY");
     _columnMappings.Add("COMPANY", "COMPANY");
     _columnMappings.Add("COMPANYNAME", "COMPANY");
     _columnMappings.Add("BUSINESS", "COMPANY");
     _columnMappings.Add("ADDRESS1", "LINE1");
     _columnMappings.Add("LINE1", "LINE1");
  }

并且可以像这样使用:

 var columnName = "FIRM";
 var map = new Dictionary<string, string>();
 var colKey = string.Empty;
 if (_columnMappings.TryGetValue(columnName, out colKey))
    map.Add(colKey, columnName);

推荐阅读