2017-03-31 82 views
0

每天我需要使用FileHelpers库在c#应用程序中处理5个文件。每个文件来自不同的客户端。如何在FileHelpers中动态更改类的字段顺序

这些文件都代表相同的实体 - 所以我在我的程序中有一个“个人”类,其中包含所有的字段,我需要从文件中加载数据到这个对象。 (这些文件是分隔文件)

问题是每个文件都按照它自己的顺序到达列。 因此: 客户端1发送:名称,姓氏,SSN,年龄 客户端2发送:姓名,年龄,姓氏,SSN 客户端3发送:名称,SSN,姓氏(年龄是可选的 - 所以此客户端不发送它)

我真的很喜欢这个使用单一类,而不是为每个客户端创建一个类来处理 - 因为我的客户群将有望增长:-)

没有人有处理这种情况的任何巧妙的构思与FileHelpers?

感谢

回答

0

的解决办法是插入一个字段名称的标题行对每个csv文件,并在你的班级管理它

0

就个人而言,我反而有力地推动了这些方法中的任何一个:

a)强制字段顺序(以及每列数据类型的确切规格,唯一性等)新客户端使用规定的格式,并鼓励旧客户端在对其导出进行其他更改时进行切换。

b)让您的客户切换到指定字段顺序无关紧要的格式,例如JSON或XML。用例如“它允许更多的功能”。 c)如果a)& b)不可行,则在需要时使用多个类,作为转换到自己的内部类之前的预处理。如果您无法向您的客户强制使用字段顺序,那么除了字段顺序以外的其他内容很有可能在某些时候也会有所不同,因此您最终会根据客户的具体情况处理。仍尽可能使用几个类,也许有些客户端可以使用相同的顺序&内容。

我0.02SKr价值(即瑞典:)

0

您可以使用DelimitedClassBuilder和建立你的代码记录类。

string[] columns; // populate this somehow: e.g., read the header. 

// create the FileHelpers record class 
// alternatively there is a 'FixedClassBuilder' 
DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); 
cb.IgnoreFirstLines = 1; 
cb.IgnoreEmptyLines = true; 

// populate the fields based on the columns 
foreach (string column in columns) 
{ 
    cb.AddField(column, typeof(string)); 
    cb.LastField.TrimMode = TrimMode.Both; 
} 

// load the dynamically created class into a FileHelpers engine 
FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass()); 

// import your records 
DataTable dt = engine.ReadFileAsDT("testCustomers.txt");