2016-09-13 13 views
-2

Я получаю сообщение об ошибке IndexOutOfRangeException was unhandled на линии int euros = int.Parse(values[1]).IndexOutOfRangeException был необработанным

Мой файл .csv выглядит:

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

Привет Андрюс. Я проголосовал за закрытие вашего сообщения. Пожалуйста, ознакомьтесь с информацией о типах вопросов, которые здесь полезны. Сообщения, которые в основном представляют собой кодовые дампы, сопровождаемые неявным или явным «Пожалуйста, разрешите это для меня», неодобрились. Вместо этого вы должны использовать отладчик для выполнения кода. – ray

+0

как @ray сказал: используйте отладчик, установите курсор на 'string [] values ​​= line.split (';');', нажмите F9 и перейдите F5. Затем вы можете пройти через него. переместите курсор над 'values' и просмотрите содержимое. – Radinator

ответ

0

Ваш вклад CSV является запятой отделенный в то время как в коде вы разделив на точкой с запятой. Изменение split() параметр ,:

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

Вы также можете добавить проверку формата ввода для обеспечения values массива содержит, по меньшей мере, три элемента и числовые поля фактически содержат целые значения (int.TryParse() может помочь с этим):

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

Извините, я просто случайно поставил неправильный символ, однако проблема остается прежней - я получаю ту же ошибку. EDIT: на самом деле прямо сейчас, это говорит, что «FormatException был необработанным». Форма входной строки не была в правильном формате. – Andrius

+0

Тогда, скорее всего, у вас есть некорректно отформатированные строки в CSV-файле. Обновлен ответ с такой проверкой. –

+0

"FormatException был необработанным" из-за неправильных числовых значений. Используйте 'int.TryParse()', чтобы проверить это. См. Обновленный ответ. –

0

Возможно, у вас есть несколько пустых строк в файле CSV. я предлагаю использовать Linq подытожить евро:

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

Окончательное решение будет

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