2014-01-25 6 views
0

Я работаю над назначением, которое хранит данные из CSV-файла в массив. Я использовал для (int i = 0; i < data.Length; i ++), но i ++ недоступен. Посмотрите на код, который вы узнаете. Проблема в том, чтобы хранить только возможно. Помогите мне, если сможете.Прочтите файл .csv и сохраните его в массиве?

Благодаря

static void Load(string[] EmployeeNumbers, string[] EmployeeNames, string[] RegistrationNumbers, float[] EngineCapacityArray, 
     int[] StartKilometresArray, int[] EndKilometresArray, string[] TripDescriptions, bool[] PassengerCarriedArray, 
     ref int NextAvailablePosition, ref int RecordCount, ref int CurrentRecord) 
    { 
     string str = ""; 
     FileStream fin; 
     string[] data; 
     bool tval = false; 
     // Open the input file 
     try 
     { 
      fin = new FileStream("carallowance.csv", FileMode.Open); 
     } 
     catch (IOException exc) 
     { 
      Console.WriteLine(exc.Message); 
      return; 
     } 
     // Read each line of the file 
     StreamReader fstr_in = new StreamReader(fin); 
     try 
     { 
      while ((str = fstr_in.ReadLine()) != null) 
      { 
       // Separate the line into the name and age 
       data = str.Split(';'); 
       if (data.Length == 8) 
       { 
        Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format."); 
       } 
       for (int i = 0; i < data.Length; i++) 
       { 
        EmployeeNumbers[NextAvailablePosition] = data[0]; 
        EmployeeNames[NextAvailablePosition] = data[1]; 
        RegistrationNumbers[NextAvailablePosition] = data[2]; 
        tval = float.TryParse(data[3], out EngineCapacityArray[NextAvailablePosition]); 
        tval = int.TryParse(data[4], out StartKilometresArray[NextAvailablePosition]); 
        tval = int.TryParse(data[5], out EndKilometresArray[NextAvailablePosition]); 
        TripDescriptions[NextAvailablePosition] = data[6]; 
        tval = bool.TryParse(data[7], out PassengerCarriedArray[NextAvailablePosition]); 

        CurrentRecord = NextAvailablePosition; 
        NextAvailablePosition++; 
        RecordCount++; 
        Console.WriteLine("Your file is sucessfully loaded."); 

        break; 
       } 
      } 
     } 
     catch (IOException exc) 
     { 
      Console.WriteLine(exc.Message); 
     } 
     // Close the file 
     fstr_in.Close(); 
    } 
+0

Почему вы не устанавливаете точку останова и не проходите через код? Неправильно размещенный перерыв не трудно увидеть во время отладки. –

+0

«успешно» -> «успешно»? –

ответ

1

Это недостижимо из-за перерыв; в конце цикла. Это заставляет цикл for прекратить выполнение после первого раза. Если вы запустите в проекте консоли, это будет только потушить 0.

private static void Main(string[] args) 
    { 
     for (int i = 0; i < 2; i++) 
     { 
      Console.WriteLine(i.ToString()); 
      break; 
     } 
    } 
+0

все еще рушится на [1] ... – user3235894

0

Этот фрагмент кода:

  NextAvailablePosition++; 
      RecordCount++; 
      Console.WriteLine("Your file is sucessfully loaded."); 

      break; // <-- this instruction 
     } 

выводящие вас из цикл без возможности приращения i стоимость.

+0

не сделал никакой разницы..просил уже .. спасибо за то, что у меня есть вид :) – user3235894

0

Проблема: вы должны добавить break заявление внутри if condition (который находится внутри цикла while), так что, если длина данных не соответствует 8, то он сломается/выйти из цикла. но вы ошибочно добавили break внутри for-loop. Поэтому он выполняется только в первый раз и выходит из цикла.

Переведите инструкцию break из цикла for в if-blcok внутри цикла while.

Попробуйте:

Шаг 1: Удалите break заявление из-за цикла.

   CurrentRecord = NextAvailablePosition; 
       NextAvailablePosition++; 
       RecordCount++; 
       Console.WriteLine("Your file is sucessfully loaded."); 

       // break; //move this statement to inside the if block 

Шаг 2: установите break утверждения в IF-блоке внутри в то время цикла.

  if (data.Length == 8) 
      { 
       Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format."); 
       break; 
      } 

Предложение: вы можете переписать свой код, используя File.ReadAllLines() метод, чтобы избежать сложности, как показано ниже:

static void Load(string[] EmployeeNumbers, string[] EmployeeNames, string[] RegistrationNumbers, float[] EngineCapacityArray, 
    int[] StartKilometresArray, int[] EndKilometresArray, string[] TripDescriptions, bool[] PassengerCarriedArray, 
    ref int NextAvailablePosition, ref int RecordCount, ref int CurrentRecord) 
    { 
      string str = "";   
      string[] data; 
      bool tval = false; 
      String [] strLines=File.ReadAllLines("carallowance.csv"); 
      for(int i=0;i<strLines.Length;i++) 
      { 
      str=strLines[i]; 
      data = str.Split(';'); 
      if (data.Length == 8) 
      { 
       Console.WriteLine("Error: Could not load data from the file. Possibly incorrect format."); 
       break; 
      }//End of if block 
      else 
      { 
       EmployeeNumbers[NextAvailablePosition] = data[0]; 
       EmployeeNames[NextAvailablePosition] = data[1]; 
       RegistrationNumbers[NextAvailablePosition] = data[2]; 
       tval = float.TryParse(data[3], out EngineCapacityArray[NextAvailablePosition]); 
       tval = int.TryParse(data[4], out StartKilometresArray[NextAvailablePosition]); 
       tval = int.TryParse(data[5], out EndKilometresArray[NextAvailablePosition]); 
       TripDescriptions[NextAvailablePosition] = data[6]; 
       tval = bool.TryParse(data[7], out PassengerCarriedArray[NextAvailablePosition]); 

       CurrentRecord = NextAvailablePosition; 
       NextAvailablePosition++; 
       RecordCount++;      
      } //End of else block 
      } //End of for loop 
      Console.WriteLine("Your file is sucessfully loaded."); 
    } //End of function 
+0

Я пробовал то, что вы предложили, проблема в том, что сейчас программа не закрывается ... Как ее закрыть ?? – user3235894

1

Возможно, просмотр кода stackexchange будет лучше. Здесь есть ряд проблем.

Сначала мы можем упростить использование фреймворка callto File.ReadAllLines (...). Это даст вам последовательность всех строк в файле. Затем вы хотите преобразовать это в последовательность массивов (разделить на «,»). Это прямолинейно:

var splitLines = File.ReadAllLines("\path") 
        .Select(line => line.Split(new char[] { ',' })); 

Теперь вы можете просто перебирать splitLines с помощью foreach.

(Я замечаю, что вы, кажется, устанавливаете значения в переданные массивы. Старайтесь не привыкать к этому. Эти побочные эффекты и злоупотребление ссылочными параметрами склонны к тому, чтобы стать очень хрупкими ,)

Тогда это кажется очень странным:

if (data.Length == 8) 
{ 
    Console.WriteLine("..."); 
} 

Я подозреваю, что вы просто опечатка в вашем операторе сравнения (должно быть =). Если вам не нравится писать на консоль на плохих данных, вы можете просто просто отфильтровать плохие данные после преобразования. Это выглядит следующим образом:

var splitLines = File.ReadAllLines("\path") 
        .Select(line => line.Split(new char[] { ',' })) 
        .Where(data => data.Length == 8); 

Теперь вспомнит, что [int/float].TryParse(s, out v) будет установлен V будет значение, было проанализировано, или значение по умолчанию для данного типа, и возвращает истину, если синтаксический анализ был успешным. Это важно или «важно». Это означает, что вы набиваете плохие/недопустимые значения, если они не могут быть проанализированы, и вы ничего не делаете с tval.

Вместо всего этого рассмотрите объект/тип, который представляет запись из вашего набора данных. Похоже, вы пытаетесь отслеживать пробег сотрудников из таблицы csv. Это выглядит примерно так:

public class MileageRecord 
{ 
    public string Name { get; set; } 
    /* More properties */ 
    public MileageRecord FromCSV(string[] data) 
    { 
     /* try parsing, if not then log errs to file and return null */ 
    } 
} 

Теперь вы избавились от всех своих побочных эффектов, и все это чище. Загрузка всех этих данных из файла так же проста:

public static IEnumerable<MileageRecord> Load() 
{ 
    return File.ReadAllLines("\path") 
       //.Skip(1) // if first line of the file is column headers 
       .Select(line => line.Split(new char[] { ',' })) 
       .Where(data => data.Length == 8) 
       .Select(data => MileageRecord.FromCSV(data)) 
       .Where(mileage => mileage != null); 
} 
Смежные вопросы