我有一个用于存储数据映射的表。我的模型看起来像这样
public class MapperTable
{
public string EE_First_Name {get; set;}
public string EE_Last_Name {get; set;}
public string EE_MI {get; set;}
}
此表的目的是存储来自csv的映射,以便我可以创建具有这些字段的对象。 因此,如果csv中的第一个名称字段是FirstName *,它与我的表匹配,然后我创建一个具有FirstName *值的新对象,并将字段名称设置为EE_First_Name
我通过Id保存映射,当用户选择Id时,我使用该特定映射来映射来自csv的数据。
public MapperTableConvertCsvUsingMap(DataTable csv){
var namesFromColumnCsvMap = DataAccess.ExportCsvMaps.FindByExp(x => x.ConfigId == idINt).FirstOrDefault();
foreach(DataRow row in Csv.Rows)
{
var csvMapped = new MapperTable {
EE_First_Name = row[namesFromColumnCsvMap.EE_First_Name__.TrimEnd()].ToString(),
EE_Last_Name__ = row[namesFromColumnCsvMap.EE_Last_Name__.TrimEnd()].ToString(),
EE_MI = row[namesFromColumnCsvMap.EE_MI.TrimEnd()].ToString(),
};
}
如果仅正确映射所有列,则此方法有效。如果他们不完全匹配就会爆炸。将csv中的列标题与存储在表中的列标题定义匹配以创建新对象的更好方法是什么?
我有一个看起来像这样的csv
它需要看起来像这样
列映射需要存储在数据库中,以便可以重复该过程。传入的csv可能与所示的不同,但应该能够使用数据库中存储的值映射到最终的csv。
答案 0 :(得分:1)
首先检查列中是否存在要映射的表/ csv,然后再尝试访问它。然后,您可以访问该列(如果存在)或返回一些默认值,如空字符串""
或其他内容。
public MapperTable[] ConvertCsvUsingMap(DataTable csv) {
var namesFromColumnCsvMap = DataAccess.ExportCsvMaps.FindByExp(x => x.ConfigId == idINt).FirstOrDefault();
foreach (DataRow row in csv.Rows) {
var csvMapped = new MapperTable {
EE_First_Name = namesFromColumnCsvMap.EE_First_Name != null && csv.Columns.Contains(namesFromColumnCsvMap.EE_First_Name.TrimEnd()) ? row[namesFromColumnCsvMap.EE_First_Name.TrimEnd()].ToString() : "",
EE_Last_Name = namesFromColumnCsvMap.EE_Last_Name != null csv.Columns.Contains(namesFromColumnCsvMap.EE_Last_Name.TrimEnd()) ? row[namesFromColumnCsvMap.EE_Last_Name.TrimEnd()].ToString() : "",
EE_MI = namesFromColumnCsvMap.EE_MI != null && csv.Columns.Contains(namesFromColumnCsvMap.EE_MI.TrimEnd()) ? row[namesFromColumnCsvMap.EE_MI.TrimEnd()].ToString() : "",
};
//...
}
}
上面的代码首先检查映射的列名是否存在于要映射的表中,然后再尝试获取行中的值。如果找不到匹配项,则将映射的对象属性设置为空字符串。