2016-05-27 9 views
1

Ich muss eine TXT-Datei mit fester Länge analysieren und in XML konvertieren. Dafür versuche ich die Datei Helfer Bibliothek zu benutzen.SolvingBadUse Ausnahme in FileHelpers C#

Meine TXT-Datei sieht etwa so aus. Es gibt die richtige Anzahl von Leerzeichen zwischen den Spalten. Stackoverflow hat sie entfernt, auch Textdateien können hier nicht gepostet werden, also ist dies das Beste was ich tun kann.

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 

Meine Haupt wie folgt aussieht

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(); 
    } 

Jedes Mal, wenn ich das Programm ein neues windoe öffnet laufen, die den Pfad der Datei hervorhebt und sagt

BadUsageException unhandled war. End Of Line Ergebnis der Verarbeitung des Feldes: XYZ in Zeile 2 (Sie müssen es als markieren [FieldOptional, wenn Sie diese Ausnahme vermeiden möchten])

Wenn ich das Feld als optional (auch hinzufügen, wenn dies nicht der Fall optional in irgendeiner Weise und ist in der Tat sehr wichtig) gibt es eine ganze Reihe von anderen Fehlern.

EDIT: Hier ist die Definition für 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

Es könnte sein, ein anderes Feld zu testen, die gerade fehlt aber in den falschen Bereich immer geladen. Es gibt nicht genug Informationen zur Diagnose. Bitte editieren Sie Ihre Frage und fügen Sie die Klassendefinition für 'VWDischargeTXT' hinzu.Bitte stellen Sie auch sicher, dass die Daten in Ihrer Frage mit Ihrer Datendatei übereinstimmen (Sie sagten, dass es "etwas" ist), und veröffentlichen Sie sie als Text, der als Code und nicht als Screenshot formatiert ist. – Tone

+0

Die Bearbeitung wurde hinzugefügt :) @Tone –

+0

Entschuldigung, ich habe meinen Kommentar bearbeitet, als Sie gepostet haben, Sie haben es vielleicht nicht bemerkt. Ich werde einige Ihrer Daten sehen müssen (Ihre 'VWDischargeTXT'-Klasse stimmt nicht mit den Daten in der Frage überein, also wird es nicht funktionieren). – Tone

Antwort

2

Wie Sie wies darauf hin, sieht der Abstand ein wenig in Ihrer Frage ab. Ich habe es bearbeitet, nur um die Daten als Code zu formatieren, der aussieht, um es richtig zu formatieren (es scheint gut beabstandet).

Basierend auf dieser Änderung habe ich Ihre VWDischargeTXT Klasse geändert, so dass es mit den Daten arbeiten wird. Es wird

[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; 
} 

Einige Hinweise:

  • FixedMode.AllowLessChars hinzugefügt wird, einen Fehler zu beheben geworfen beschwerte sich über die DischargeDate Feld auf der Leitung 11. Dies kann nur sein die Formatierung der Daten in Frage.
  • IgnoreEmptyLines wurde hinzugefügt, um die Leerzeilen zu überspringen. Diese Leerzeichen könnten genau so aussehen, wie sie in die Frage eingefügt wurden.
  • Die Definition von AcctNum wurde in long geändert, da es zu groß ist, um in eine int konvertiert zu werden.
  • Ihre char Felder wurden in string geändert, da char nur für einzelne Zeichen verwendet wird.
  • Die Feldlänge für CustomerName wurde von 126 in 137 geändert, um den Daten zu entsprechen.

Ich habe Ihren Code aktualisiert alle Felder zu zeigen, wenn Sie

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

Vielen Dank! Das ist großartig! –

+0

Kein Problem. Froh, dass ich Helfen kann. – Tone

+0

Irgendeine Idee was das bedeuten könnte? Zeile: 1 Spalte: 256. Kein Wert für das Werttypfeld gefunden: 'DischargeDate' Klasse: 'VWDischargeTXT'. Sie müssen das [FieldNullValue] -Attribut verwenden, da es sich um einen Werttyp handelt, der nicht null sein oder einen Nurable-Typ anstelle des aktuellen Typs verwenden kann. –