2016-05-27 13 views
1

固定長のtxtファイルを解析してXMLに変換する必要があります。そのために、ファイルヘルパーライブラリを使用しようとしています。FileHelpersでのSolvingBadUsage例外C#

私のtxtファイルは、これと少し似ています。列間には正しい数のスペースがあります。 Stackoverflowはそれらを削除しました。これもテキストファイルをここに掲載することはできません。私は、ファイルのパスを強調し、

BadUsageExceptionが未処理だったと言う新しいwindoeが開き、プログラムを実行するたびに、この

static void Main(string[] args) 
    { 


     var engine = new FixedFileEngine<VWDischargeTXT>(); 
     VWDischargeTXT[] result = engine.ReadFile("C:\\Users\\GL1676\\Desktop\\CSRSDischarge01112016.txt"); 

     foreach (var detail in result) 
      Console.WriteLine(" AcctNum: {0}, Province: {1}", detail.AcctNum, detail.province); 

     Console.Read(); 
    } 

よう

00000265287331ON  Gaurav lath                                WVWDM9AJ3BW054510   665300313           20160111      

00000265412333AB  Kritin Kapoor                               WVWBA7AJ5AW423323   10100510855          20160111      

00000265409491BC  Gary Kasprov                                WVWMN9AN2AE538477   773713F           20160111      

00000265723428ON  ASBDHJW                                 3VWDX7AJ5BM008640   666760743           20160111      

00003245782928AB  Damn bruh                                3VWDX7AJ7BM008526   10101931403          20160111      

12345665842041NB  Ayeyeyeye Yoyoyoy                              3VWDX7AJ4BM317970   19498690           20160111      

09876565877284ON  Sample Name                                3VWLX7AJ0BM004748   665727399           20160111      

76542365887122AB  Dragutiin ivanovic                              WVWCA7AJ7BW072789   10102120532          20160111      

09843266079601BC  Wayne Rooney                                3VW3L7AJ4BM014663   837089F           20160111      

23049466096203SK  John Terry                                3VWBK7AJXBM311645   300656416           20160111 

私の主なルックス。 (この例外を回避するには、[FieldOptional]として指定する必要があります)

フィールドをオプションとして追加すると任意であり、実際には非常に重要です)、他にも多くのエラーがあります。

EDIT:あなたが指摘したように ここVWDischargeTXT

[FixedLengthRecord()] 
class VWDischargeTXT 
{ 
    [FieldFixedLength(14)] 
    public int AcctNum; 

    [FieldFixedLength(8)] 
    [FieldTrim(TrimMode.Right)] 
    public char province; 

    [FieldFixedLength(126)] 
    [FieldTrim(TrimMode.Right)] 
    public char CustomerName; 

    [FieldFixedLength(26)] 
    [FieldTrim(TrimMode.Right)] 
    public char VIN; 

    [FieldFixedLength(51)] 
    [FieldTrim(TrimMode.Right)] 
    public char RegNo; 

    [FieldFixedLength(31)] 
    [FieldTrim(TrimMode.Right)] 
    [FieldConverter(ConverterKind.Date, "yyyyMMdd")] 
    public DateTime DischargeDate; 
} 
+1

をテストしたい場合、私はすべてのフィールドを表示するようにコードを更新しました。診断するのに十分な情報がありません。あなたの質問を編集し、 'VWDischargeTXT'のクラス定義を追加してください。また、あなたの質問のデータがデータファイルと一致していることを確認してください(あなたはそれが「多少」そうです)、スクリーンショットではなくコードとしてフォーマットされたテキストとして投稿してください。 – Tone

+0

編集を追加しました:) @Tone –

+0

申し訳ありません投稿したときに自分のコメントを編集しましたが、お気づきかもしれません。あなたのデータの一部を見る必要があります(あなたの 'VWDischargeTXT'クラスは問題のデータと全く一致しませんので、うまくいきません)。 – Tone

答えて

2

の定義があり、間隔は、あなたの質問に少しオフになります。私はそれを正しくフォーマットしているように見えるコードとしてデータを整形するために編集しました。

この編集に基づいて、私はあなたのVWDischargeTXTクラスを変更して、データで動作するようにしました。

  • FixedMode.AllowLessCharsは、これは単なる 問題のデータのフォーマットかもしれライン11にDischargeDateフィールド不満 スローエラーを修正するために追加された:それは

    [FixedLengthRecord(FixedMode.AllowLessChars)] 
    [IgnoreEmptyLines] 
    class VWDischargeTXT 
    { 
        [FieldFixedLength(14)] 
        public long AcctNum; 
    
        [FieldFixedLength(8)] 
        [FieldTrim(TrimMode.Right)] 
        public string province; 
    
        [FieldFixedLength(137)] 
        [FieldTrim(TrimMode.Right)] 
        public string CustomerName; 
    
        [FieldFixedLength(26)] 
        [FieldTrim(TrimMode.Right)] 
        public string VIN; 
    
        [FieldFixedLength(51)] 
        [FieldTrim(TrimMode.Right)] 
        public string RegNo; 
    
        [FieldFixedLength(31)] 
        [FieldTrim(TrimMode.Right)] 
        [FieldConverter(ConverterKind.Date, "yyyyMMdd")] 
        public DateTime DischargeDate; 
    } 
    

    いくつかの注意となります。

  • IgnoreEmptyLinesが追加され、空白行はスキップされます。これらの空白は、単に質問に貼り付けられた方法かもしれません。
  • AcctNumの定義は、intに変換するには大きすぎるため、longに変更されました。
  • charのフィールドがstringに変更されました。charは1文字にのみ使用されています。
  • CustomerNameのフィールド長は、データと一致するように126から137に変更されました。

あなたはそれが欠落しているが、単に間違ったフィールドにロードされたばかりの別のフィールドであるかもしれない

static void Main(string[] args) 
    { 
     var engine = new FixedFileEngine<VWDischargeTXT>(); 
     VWDischargeTXT[] result = engine.ReadFile("C:\\Users\\GL1676\\Desktop\\CSRSDischarge01112016.txt"); 

     foreach (var detail in result) 
      Console.WriteLine(" AcctNum: {0}, Province: {1}, CustomerName: {2}, VIN: {3}, RegNo: {4}, DischargeDate: {5}", 
       detail.AcctNum, detail.province, detail.CustomerName, detail.VIN, detail.RegNo, detail.DischargeDate); 

     Console.Read(); 
    } 
+0

ありがとうございました!これは素晴らしいです! –

+0

問題ありません。喜んで助けてください。 – Tone

+0

これはどういう意味でしょうか? 行:1列:256値型フィールドの値が見つかりません: 'DischargeDate'クラス: 'VWDischargeTXT'。 これは値型であり、現在の型ではなくヌルまたはNullable型を使用できないため、[FieldNullValue]属性を使用する必要があります。 –