2016-09-19 1 views
0

Wenn Debugger ausgeführt wird, bin ich die folgende Störung zu erhalten,VB.NET CSV Lesen und das Hinzufügen neuer Felder bedingt

Eine erste Chance Ausnahme des Typs ‚System.IndexOutOfRangeException‘ aufgetreten in HSL Datei Config.exe Zusätzliche Informationen: Index war außerhalb der Grenzen des Arrays. Eine nicht behandelte Ausnahme vom Typ 'System.IndexOutOfRangeException' ist in HSL File Config.exe aufgetreten. Weitere Informationen: Index befand sich außerhalb der Grenzen des Arrays. Das Programm '[14044] HSL-Datei Config.vshost.exe: Managed (v4.0.30319)' wurde mit Code 0 (0x0) beendet.

Ich habe die CSV-Datei überprüft im Laden ist in der Tat 30 Spalten lang und keine Leerzeilen. Es gibt jedoch einige leere Felder.

Dim FileName = tbOpen.Text 
    Dim fileout = tbSave.Text 
    Dim lines = File.ReadAllLines(FileName) 
    Dim output As New List(Of String) 

    For Each line In lines 
     Dim fields = line.Split(","c) 
     If fields(0) = "R62167" Then 
      ReDim Preserve fields(fields.Length) 
      fields(31) = "9991" 
     End If 
     If fields(0) = "R62193" Then 
      ReDim Preserve fields(fields.Length) 
      fields(32) = "1999" 
     End If 
     If fields(2) = "2249" Then 
      fields(2) = "0000" 
     End If 

     output.Add(String.Join(","c, fields)) 
    Next 
    File.WriteAllLines(fileout, output) 

Antwort

1

Verwenden

If fields(5) = "4WK" Then 
    ReDim Preserve fields(fields.Length) 
    fields(6) = "NewDate" 
End If 
+0

Dank Mukul Varshney, du hast meinen Speck gerettet! tolle. kann nicht glauben, es war etwas so einfach :) – JustAnAverageSQLuser

+0

danke für die info, aber immer fehler mit größeren datensätzen (rund 30 spalten) Eine erste chance ausnahme des typs 'System.ArgumentOutOfRangeException' aufgetreten in mscorlib.dll – JustAnAverageSQLuser

+0

wird vorschlagen, dass Definieren Sie Felder Array mit einer erwarteten maximalen Spalten außerhalb der for-Schleife. Verwenden Sie eine variable Anzahl, um den Wert der Felder zu aktualisieren. Felder (Zähler) = Zähler "NewDate" = Zähler +1, sobald Sie einen Wert hinzufügen oder Felder als Liste deklarieren. Dies wird ähnlich dem sein, was @FloatingKiwi vorgeschlagen hat. –

0

Statt Fields der Verwendung als ein Array es als Liste versuchen, da diese Größe veränderbar sind.

Dim fields = line.Split(","c).ToList() 

dann können Sie

If fields(5) = "4WK" Then 
    fields.Add("NewDate") 
End If 
+0

Dank beide REDIM tun. Dies scheint gut mit kleinen Mengen von Daten zu funktionieren, aber sobald ich es mit der realen Datei versuche im Versuch zu manipulieren bekomme ich Eine erste Chance Ausnahme des Typs 'System.ArgumentOutOfRangeException' in mscorlib.dll Fehler aufgetreten irgendwelche Ideen? Code snippit – JustAnAverageSQLuser

+0

Dim filename = tbOpen.Text Dim FileOut = tbSave.Text Dim Zeilen = File.ReadAllLines (Filename) Dim Ausgabe As New List (Of String) für jede Zeile in Linien 'Version folgen 1 Dim Felder = line.Split ("," c) Dim Felder = line.Split ("," c) .ToList() Wenn Felder (28) = "PLZPEED" Dann fields.Add ("NewDateD") End If output.Add (String.Join ("" c, Felder)) Weiter File.WriteAllLines (FileOut, output) – JustAnAverageSQLuser

+0

es sehen ms, um in einem anderen Feld als fields (0) zu scheitern, wenn das hilft? – JustAnAverageSQLuser

Verwandte Themen