2011-02-17 61 views
5

我想導入一個文件,其中有多個記錄定義。每個人也可以有一個標題記錄,所以我想我會像這樣定義一個定義界面。使用泛型類定義導入數據文件

public interface IRecordDefinition<T> 
{ 
    bool Matches(string row); 
    T MapRow(string row); 
    bool AreRecordsNested { get; } 
    GenericLoadClass ToGenericLoad(T input); 
} 

然後我創建了一個類的具體實現。

public class TestDefinition : IRecordDefinition<Test> 
{ 
    public bool Matches(string row) 
    { 
     return row.Split('\t')[0] == "1"; 
    } 

    public Test MapColumns(string[] columns) 
    { 
     return new Test {val = columns[0].parseDate("ddmmYYYY")}; 
    } 

    public bool AreRecordsNested 
    { 
     get { return true; } 
    } 

    public GenericLoadClass ToGenericLoad(Test input) 
    { 
     return new GenericLoadClass {Value = input.val}; 
    } 
} 

但是爲每個文件定義我需要存儲的記錄定義的列表,這樣我就可以再通過該文件,並進行相應的處理中的每一行循環。

首先,我在正確的軌道上
還是有更好的方法來做到這一點?

+1

您是否想發佈任何示例文件以使示例更具體? – 2011-02-17 01:33:48

+1

什麼是源數據?文本? CSV?二進制?以上任何一項? – 2011-02-20 01:15:37

回答

3

你看過什麼用Linq?這是Linq to Text和Linq to Csv的一個簡單例子。

我認爲使用「yield return」和IEnumerable來得到你想要的工作會簡單得多。通過這種方式,您可能只能在界面上使用1種方法。

3

我會將這個過程分成兩部分。

首先,一個特定進程將文件分成多個文件。如果這些文件的寬度是固定的,那麼我對正則表達式有很大的好運。例如,假設以下是具有三種不同記錄類型的文本文件。

TE20110223 A 1 
RE20110223 BB 2 
CE20110223 CCC 3 

你可以看到這裏有一個模式,希望的人誰決定把所有的記錄類型在同一個文件給你一個方法來識別這些類型。在上面的例子中,你將定義三個正則表達式。

string pattern1 = @"^TE(?<DATE>[0-9]{8})(?<NEXT1>.{2})(?<NEXT2>.{2})"; 
string pattern2 = @"^RE(?<DATE>[0-9]{8})(?<NEXT1>.{3})(?<NEXT2>.{2})"; 
string pattern3 = @"^CE(?<DATE>[0-9]{8})(?<NEXT1>.{4})(?<NEXT2>.{2})"; 

Regex Regex1 = new Regex(pattern1); 
Regex Regex2 = new Regex(pattern2); 
Regex Regex3 = new Regex(pattern3); 

StringBuilder FirstStringBuilder = new StringBuilder(); 
StringBuilder SecondStringBuilder = new StringBuilder(); 
StringBuilder ThirdStringBuilder = new StringBuilder(); 

string Line = ""; 
Match LineMatch; 


FileInfo myFile = new FileInfo("yourFile.txt"); 

using (StreamReader s = new StreamReader(f.FullName)) 
{ 

    while (s.Peek() != -1) 
    { 
     Line = s.ReadLine(); 

     LineMatch = Regex1.Match(Line); 
     if (LineMatch.Success) 
     { 
      //Write this line to a new file 
     } 

     LineMatch = Regex2.Match(Line); 
     if (LineMatch.Success) 
     { 
      //Write this line to a new file 
     } 

     LineMatch = Regex3.Match(Line); 
     if (LineMatch.Success) 
     { 
      //Write this line to a new file 
     } 
    } 
} 

接下來,我們取分割文件,並通過通用過程中運行它們,你很可能已經具備,將其導入。這很好,因爲當進程不可避免地失敗時,你可以將它縮小到失敗的單一記錄類型,而不會影響所有記錄類型。將主文本文件與分割文件一起歸檔,您的生活也將變得更加容易。

處理這些類型的傳輸文件很難,因爲別人控制它們,你永遠不知道它們什麼時候會改變。記錄原始文件以及收據的導入非常重要,不應該被忽視。你可以儘可能簡單或複雜,但我傾向於將收據寫入數據庫並將該表中的主鍵複製到表中我已導入數據的外鍵中,然後從不更改該數據。我喜歡在文件系統和數據庫服務器上保留一個不受干擾的導入副本,因爲存在不可避免的轉換/轉換問題,您需要跟蹤這些問題。

希望這會有所幫助,因爲這不是一項簡單的任務。我認爲你在正確的軌道上,而不是單獨處理/導入每一行......將它們寫入單獨的文件。我假設這是財務數據,這是我認爲在每一步中可證明性都很重要的原因之一。