2012-02-23 92 views
2

我需要讀取一個包含記錄的文本文件。在前兩行中有一個包含多個字段的標題,然後列出記錄。每條記錄包含三行。每條記錄都由固定長度的字段組成。我想用字段填充數據表。從文本文件中讀取多行固定寬度記錄

例如文件看起來是這樣:

header1 0101 2012 
header2 0202 0000 
rec10 abc 
rec11 def 
rec12 ghi 
rec20 jkl 
rec21 mno 
rec22 pqr 

對於每個字段,我有開始和字段的長度。

我試着用StreamReader和子串,它的工作,但它非常尷尬。

有沒有更好的方法來做到這一點?

+1

你可能想在programmers.stackexchange.com上發佈這個問題,因爲它更多地圍繞算法而不是直接的問答。它可能比事實獲得更多的意見。 – Lazarus 2012-02-23 11:06:59

回答

2

使用FileHelpers library,您的例子可以被解析如下:

聲明一個類來表示你的對象:

[IgnoreFirst(2)] 
[FixedLengthRecord(FixedMode.ExactLength)] 
public sealed class Record 
{ 
    [FieldTrim(TrimMode.Right)] 
    [FieldFixedLength(6)] 
    public String Header1; 


    [FieldFixedLength(3)] 
    public String Data1; 

    [FieldInNewLine()] 
    [FieldTrim(TrimMode.Right)] 
    [FieldFixedLength(6)] 
    public String Header2; 

    [FieldFixedLength(3)] 
    public String Data2; 

    [FieldInNewLine()] 
    [FieldTrim(TrimMode.Right)] 
    [FieldFixedLength(6)] 
    public String Header3; 

    [FieldFixedLength(3)] 
    public String Data3; 
} 

加載數據從文件像這樣:

FileHelperEngine<Record> engine = new FileHelperEngine<Record>(); 

engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 

DataTable records = engine.ReadFileAsDT(@"myTextFile.txt"); 

if (engine.ErrorManager.ErrorCount > 0) 
    engine.ErrorManager.SaveErrors("Errors.txt"); 
0

雖然有些C#純粹主義者會忽略這個想法,但您可以包含VB.NET程序集並使用它的TextFieldParser class。當處理固定字段文本文件時非常方便,您不會重新發明輪子。您仍然需要實現代碼來檢測和處理多行記錄,但字段解析很簡單。

+0

感謝您的回答!我之前查看過TextFieldParser,但我無法弄清楚,如何使其適應我的項目。 – Fabi 2012-02-23 14:21:36