c# - 有没有更好的方法将多个头文件从输入文件映射到类模型?
问题描述
我从客户端收到各种输入文件(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 中读取数据到数据模型中。上面的代码给了我一个字典,即使数据的标题可能与我的数据模型不匹配,我也可以使用它来通过已知名称访问数据。
有没有更好的方法将这些可能的标头选项映射/解析到数据模型字段中?
解决方案
由于 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);
推荐阅读
- c++ - 我有点问题,我似乎可以理解这个错误
- java - 如何在同一个引用中设置不同的值
- cefsharp - 允许用户使用 cefsharp 浏览器使用鼠标滚轮进行缩放
- powershell - 在 Invoke-Command -Session/ComputerName 中使用 Get-FileHash 时访问被拒绝
- json - 在数组或对象中选择
- azure-devops - 切换现有组织以使用新域名 URL
- publish-subscribe - 接收消息 ID(未来)是否表明消息是在 PubSub 中发送的?
- amazon-web-services - AWS Step Function 可以描述这种数据流吗?
- string - 在 Pascal 中给出字符串类型时出错
- c# - Visual Studio:cs8300“遇到合并冲突标记”的含义?