2012-02-23 21 views
2

レコードでいっぱいのテキストファイルを読む必要があります。最初の2つの行にはいくつかのフィールドがあるヘッダーがあり、レコードがリストされます。各レコードは3行をカバーします。すべてのレコードは、固定長のフィールドを使用します。私はフィールドを持つdataTableを記入したいと思います。私は開始とフィールドの長さを持っているすべてのフィールドについてテキストファイルから複数行の固定幅レコードを読み取る

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

例えばファイルは次のようになります。

私はStreamReaderと部分文字列を試しましたが、うまくいきましたが、それは非常に難解です。

これを行うより良い方法はありますか?

+1

この質問をプログラマーに投稿したいかもしれません.stackexchange.comそれはストレートQ&Aではなくアルゴリズムを中心にしています。事実よりも多くの意見を集める可能性が高い。 – Lazarus

答えて

2

、あなたの例では、解析することができます。

は、あなたのオブジェクトを表すためにクラスを宣言します。

[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を使用することができます。固定フィールドのテキストファイルを扱う場合は非常に便利です。ホイールを再作成することはありません。複数行レコードを検出して処理するコードを実装する必要がありますが、フィールド解析は簡単です。次のようにFileHelpers libraryを使用して

+0

あなたの答えをありがとう!以前はTextFieldParserを見ていましたが、私はそれを自分のプロジェクトにどのように適合させるかを理解できませんでした。 – Fabi

関連する問題