2016-09-13 3 views
-2

Ich erhalte einen Fehler IndexOutOfRangeException was unhandled an der Linie int euros = int.Parse(values[1]).IndexOutOfRangeException wurde nicht behandelt

Meine CSV-Datei aussieht:

name, 1, 2 
name1, 3, 4 
name2, 5, 6 

public static void ReadData(out Turistai[] tourists, out int amount) 
    { 
     amount = 0; 
     tourists = new Turistai[MaxTourists]; 
     using (StreamReader reader = new StreamReader("C:\\Users\\Andrius\\Desktop\\Mokslams\\C#\\Pratybos\\P2\\P2.1\\turistai.csv")) 
     { 
      string line = null; 
      while((line = reader.ReadLine()) != null) 
      { 
       string[] values = line.Split(';'); 

       string name = values[0]; 
       int euros = int.Parse(values[1]); 
       int cents = int.Parse(values[2]); 
       Console.WriteLine(euros); 
       //Turistai tourists = new Turistai(name, euros, cents); 
       amount++; 
      } 
     } 
    } 
+0

Hallo Andrius sein wird. Ich habe eine Stimme abgegeben, um deinen Beitrag zu schließen. Informationen zu Fragen, die hier hilfreich sind, finden Sie auf der Seite "Fragen stellen". Beiträge, die im Grunde Code-Dumps gefolgt von einem impliziten oder expliziten "Bitte lösen Sie das für mich" sind verpönt. Sie sollten stattdessen einen Debugger verwenden, um den Code schrittweise zu durchlaufen. – ray

+0

als @ray sagte: Verwenden Sie den Debugger, setzen Sie den Cursor auf 'string [] values ​​= line.split (';');', drücken Sie F9 und gehen Sie F5. Dann kannst du hindurchgehen. Bewegen Sie den Mauszeiger über "Werte" und sehen Sie sich den Inhalt an. – Radinator

Antwort

0

Ihre CSV-Eingang ist Komma getrennt, während im Code werden Sie von Semikolons splitten. Ändern Sie den split() Parameter ,:

string[] values = line.Split(','); 

Sie können auch wollen Eingabeformatprüfung hinzufügen, um sicherzustellen, das values Array enthält mindestens drei Elemente, und die numerischen Felder enthalten tatsächlich ganzzahlige Werte (int.TryParse() dabei helfen kann):

while((line = reader.ReadLine()) != null) 
{ 
    string[] values = line.Split(','); 
    if (values.Length < 3) 
    { 
     Console.Error.WriteLine("Invalid input line: " + line); 
     continue; 
    } 

    string name = values[0]; 
    int euros; 
    if (!int.TryParse(values[1], out euros)) 
    { 
     Console.Error.WriteLine("Invalid euros value in the line: " + line); 
     continue; 
    } 
    int cents; 
    if (!int.TryParse(values[2], out cents)) 
    { 
     Console.Error.WriteLine("Invalid cents value in the line: " + line); 
     continue; 
    } 
    Console.WriteLine(euros); 
    //Turistai tourists = new Turistai(name, euros, cents); 
    amount++; 
} 
+0

Entschuldigung, ich habe nur versehentlich ein falsches Symbol gesetzt, aber das Problem bleibt gleich - ich bekomme den gleichen Fehler. EDIT: eigentlich gerade, es heißt "FormatException wurde unbehandelt" - Eingabe String-Formular war nicht im richtigen Format. – Andrius

+0

Dann haben Sie höchstwahrscheinlich einige falsch formatierte Zeilen in Ihrer CSV-Datei. Die Antwort wurde mit dieser Überprüfung aktualisiert. –

+0

"FormatException wurde nicht behandelt" liegt an falschen numerischen Werten. Verwenden Sie 'int.TryParse()', um dies zu überprüfen. Bitte sehen Sie die aktualisierte Antwort. –

0

Wahrscheinlich haben Sie einige leere Zeilen in der CSV-Datei. Ich schlage vor, mit Linq, um den Euro Fazit:

var data = File 
    .ReadLines("C:\\Users\\Andrius\\Desktop\\Mokslams\\C#\\Pratybos\\P2\\P2.1\\turistai.csv") 
    .Select(line => line.Split(',')) 
    .Where(items => items.Length >= 2) // filter out empty/incomplete lines 
    // To debug, let's take euros only 
    .Select(items => int.Parse(items[1])); 
    // In the final solution we'll create Touristai instances 
    // .Select(items => new Touristai(items[0], int.Parse(items[1]), int.Parse(items[2]))) 
    .ToArray(); 

Console.WriteLine(String.Join(Environment.NewLine, data)); 

Console.WriteLine(data.Sum()); 

Endlösung

public static void ReadData(out Turistai[] tourists, out int amount) { 
    tourists = File 
    .ReadLines(@"C:\Users\Andrius\Desktop\Mokslams\C#\Pratybos\P2\P2.1\turistai.csv") 
    .Select(line => line.Split(',')) 
    .Where(items => items.Length >= 2) // filter out empty/incomplete lines 
    .Select(items => new Touristai(items[0], int.Parse(items[1]), int.Parse(items[2]))) 
    .ToArray(); 

    //TODO: check syntax (I've sugested Touristai should have Euro property) 
    amount = tourists.Sum(tourist => tourist.Euro); 
} 
Verwandte Themen