2015-12-01 1 views
-1

Я пытаюсь выяснить, как читать текстовый файл и отделять его значения от массива, который содержит все строки и массив, который содержит все числа. Я пробовал искать в Google, но ничего не могу найти. Вот что в моем файле ...Visual C# - чтение из текстового файла и разделение значений в двух массивах, которые содержат разные значения.

зов долга: Расширенный [email protected]
Batman Arkham [email protected]
Carmageddon [email protected]
Halo Окончательный [email protected]
Gears войны: Золото [email protected]
My Little Pony - Zombie [email protected]
Потребность в скорости V = 452893,21
FIFA [email protected]
Batman Arkham [email protected]
NBA 2016 = 45274,89
темный [email protected]78.23
снайпер ellite [email protected]
последний хранитель = 523907,21
Ведьмак 3: дикая охота = 45294,34
Saints Row [email protected]
Mortal Kombat [email protected]

и это мой код ...

private void ReadIntoArray() 
    { 
     try 
     { 

      const int SIZE = 16; 
      string[] titleArray = new string[SIZE]; 
      //double[] salesArray = new double[SIZE]; 
      int index = 0; 
      StreamReader inputFile = File.OpenText("GameSales.txt"); 
      string title = inputFile.ReadLine(); 
      titleArray = title.Split('@', '='); 


      while (index < titleArray.Length && !inputFile.EndOfStream) 
      {          
       index++; 
      } 


      foreach (string value in titleArray) 
      { 
       detailsListBox.Items.Add(value); 
      } 

      inputFile.Close(); 

     } 



     catch 
     { 
      MessageBox.Show("Error"); 
     } 
    } 
+1

Каков ваш ожидаемый формат вывода? – Dhanuka777

+0

Что дает ваш текущий выход? –

+0

У меня есть кнопка, которая сначала показывает выходы по ценам, и кнопку, которая сначала показывает выходы по названиям. Эти выходы переходят на ListBox EX для pricesButton .. 17452,78 ==> Служебный долг: Advanced Warfare 0,0 ==> Batman Arkham Knight 734562,68 ==> Carmageddon 2015 EX для titlesButton .. Зов Duty: Advanced Warfare ==> 17452,78 Batman Arkham Knight ==> 0,0 Carmageddon 2015 ==> 734562,68 ..и так четвёртом –

ответ

1

То, что вы делаете, просто даст вам все, что угодно, между знаками «@» и «=».

Вам нужно использовать что-то вроде Regex.Split для разделения на числовые или альфа-символы и найти способ удаления символов «@» и «=». Чтобы начать работу, вот простой пример, в котором говорится, что вы хотите использовать любое количество одного или нескольких нецифровых символов в качестве разделителя. Вам понадобится немного больше, чем это для ваших собственных целей, очевидно:

// Split on one or more non-digit characters. 
    string[] numbers = Regex.Split(input, @"\D+"); 
+0

Спасибо! Я попробую ваш метод! –

0

Рассматривая свой код, вы читаете только одну строку текста. У вас есть оператор while, который ничего не делает, вам нужно переместить обработку файла в это. Ваш оператор split возвращает массив значений, первый из которых является заголовком, а второй - информацией о продажах, которую вы не используете. Этот пример должен делать то, что вы хотите.

private void ReadIntoArray() 
{ 
    try 
    { 

     const int SIZE = 16; 
     string[] titleArray = new string[SIZE]; 
     double[] salesArray = new double[SIZE]; 
     int index = 0; 
     StreamReader inputFile = File.OpenText("GameSales.txt"); 


     while (index < titleArray.Length && !inputFile.EndOfStream) 
     { 
      string title = inputFile.ReadLine(); //Note the moving of the file readline into the while statement 
      string[] temp = title.Split('@', '='); //Also used a temporary variable to hold the value of the split before assigning it to the array. 
      titleArray[index] = temp[0]; 
      salesArray[index] = double.Parse(temp[1]); 
      index++; 
     } 


     foreach (string value in titleArray) 
     { 
      detailsListBox.Items.Add(value); 
     } 
     inputFile.Close(); 

    } 
    catch 
    { 
     MessageBox.Show("Error"); 
    } 
} 
0

Вы можете сделать это в изящный способ ...

public class Movie 
{ 
    public string Series { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set; } 
} 

Тогда в вашем методе сделать это, чтобы заполнить ваш Список фильмов.

var allLines = File.ReadAllLines(@"C:\myfile.txt"); 
    List<Movie> movies = new List<Movie>(); 
    movies.AddRange(allLines.Select(m=> new Movie() 
    { 
     Series = m.Split(new []{'@'})[0].Split(new []{'='})[0].Split(new []{':'})[0], 
     Name = (m.Split(new[] { ':' }).Length > 1 ? m.Split(new[] { ':' })[1] : m.Split(new[] { ':' })[0]).Split(new[] { '@' })[0].Split(new[] { '=' })[0], 
     Value = decimal.Parse(m.Contains("@")?m.Split(new []{'@'})[1]:m.Split(new []{'='})[1]), 
    })); 

Возможно, вы сможете упростить вызовы split. Но если вы предпочитаете делать это, используя минимальное количество строк, вы можете сохранить их таким образом.

Смежные вопросы