我需要创建一个CSV映射实用程序,允许用户定义从其CSV文件到内部类的映射。例如,用户可以将last_name
列映射到client.Lastname
属性。
许多值很简单-字符串last_name
到字符串client.Lastname
。有些将需要可以编码的转换-字符串age
到int client.age
。但是,某些值需要翻译。例如,一个客户的CSV值包含“ A”,“ B”或“ C”,而另一个客户具有“ R”,“ G”或“ B”,但是内部对象使用值1、2和3。在这种情况下我需要为每个客户提供一个类似于以下内容的例程:
string => {
switch(string)
{
case "A":
return 1;
case "B":
return 2;
case "C"
return 3;
default:
return 0;
}
}
因此,我想做的是将lambda表达式与给定字段和客户的地图一起存储在地图数据库中。然后在为该客户转换CSV时阅读并执行该地图转换。因此,伪代码将如下所示:
//Read appropriate map for customer from map database
//For each row in CSV file
//Read row
//Create a new target object
//For each column in column map
//Find column in row -- string value = row[column]
//If column has transformation, execute transform code -- var newvalue = map[column].transform(value);
//Store value from column in target object property
我查看了诸如 CSVHelper 之类的实用程序,这些实用程序可用于定义转换-问题是,您必须在设计时知道需要进行哪些转换,而我正在尝试动态地进行转换运行时间,取决于哪个客户正在上载CSV。
有人做过这样的事情吗?有什么方法可以将上面的转换(使用switch语句)作为字符串存储在数据库中,重新读回并针对值执行它?
说明 从本质上讲,我们添加到系统中的每个新客户都将拥有他们自己的CSV格式-不幸的是,我们没有强迫他们使用标准CSV格式的奢望。但是,我也不想编辑代码并为每个知道如何将CSV数据转换为内部格式的新客户添加新的IF ... ELSE语句-我希望能够以某种方式将其配置并存储在我的内部映射表中。
有没有更好的方法来解决这个问题?