2017-03-31 84 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");