2014-07-26 2 views
0

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

static string[,] dates = new string[4, 2] 
     { 
      {"1870", "France was defeated in the Franco Prussian War"}, 
      {"1871", "The German Empire Merge into one"}, 
      {"1905", "The \"Schliffin PLan\" devised"}, 
      {"1914", "The Assassination of Franz Ferdinand and the start of WW1"}, 
      //etc 
     } 

Массив это просто место держатель для того, что следует читать в из текстового файла. Я знаю, что должен использовать StreamReader, а затем разделить его, но я не уверен, как это сделать. Я попытался с помощью 2 списков затем толкая их на массив как этого

//for date/event alteration 
isDate = true; 
//for find the length of the file, i don't know a better way of doing this 
string[] lineAmount = File.ReadAllLines("test.txt"); 
using (StreamReader reader = new StreamReader("test.txt")) 
       { 

        for (int i = 0; i <= lineAmount.Length; i++) 
        { 
         if (isDate) 
         { 
          //use split here somehow? 
          dates.Add(reader.ReadLine()); 
          isDate = false; 
         } 
         else 
         { 
          events.Add(reader.ReadLine()); 
          isDate = true; 
         } 
        } 
       } 


     string[] dates2 = dates.ToArray(); 
     string[] events2 = events.ToArray(); 
     string[,] info = new string[,] { }; 
     //could use dates or events for middle (they have the same amount) 
     //push the lists into a 2d array 
     for (int i = 0; i <= events2.Length; i++) 
     { 
      //gives an index out of bounds of array error 
      //possibly due to the empty array declaration above? not sure how to fix 
      info[0, i] = dates2[i]; 
      info[1, i] = events2[i]; 
     } 

Это является примером того, как текстовый файл приводятся:

1870, франко-прусская война (Франция Победила),

1871, Германская империя сливается,

Таким образом, вы, вероятно, может сказать, текстовый файл приводится почти идентично массиву. Так что мой вопрос: как бы я прочитал в этом текстовом файле в 2d-массив этого формата

+0

Можно ли с уверенностью предположить, что ни одна из вторых записей столбца не содержит в себе запятых? – dodexahedron

+0

Да, я забыл об этом! Я изменил бы это быстро. – user2977903

ответ

1

Самая большая проблема здесь в том, что вы пытаетесь сделать это с помощью массива. Если ваша программа не знает, сколько строк есть в начале, она не будет знать, как большой размер массива. Вы либо должны угадать (в лучшем случае с ошибкой, а в лучшем случае неэффективны), либо сканировать файл на количество разрывов строк (также неэффективно).

Просто используйте Список и добавьте каждую строку, которую вы прочитали в список.

что-то вроде следующего будет разобрать файл, который вы упоминаете просто отлично, если нет запятых во второй части каждой записи:

List<string[ ]> entries = new List<string[ ]>(); 
using (TextReader rdr = File.OpenText("TextFile1.txt")) 
{ 
    string line; 
    while ((line = rdr.ReadLine()) != null) 
    { 
     string[ ] entry = line.Split(','); 
     entries.Add(entry); 
    } 
} 

После того, как у Вас есть свой список, сделать все, что вы хотите с ним. Доступ к элементам списка можно получить точно так же, как массивы. Основное отличие состоит в том, что список представляет собой объект с динамическим размером, тогда как массив застревает в размере, который вы изначально делаете.

Список будет точной копией вашего текстового файла, за вычетом запятой, датами в первом элементе каждого строкового массива и текстом во втором элементе.

Это будет выводить исходный файл обратно на экран, запятые и все:

foreach (string[ ] entry in entries) 
{ 
    Console.WriteLine(string.Join(",", entry)); 
} 

Если вы хотите, чтобы получить случайный элемент из массива (вы сказали, что это учебная программа), то вы могли бы сделайте примерно следующее:

Random rand = new Random(); 
while(true) 
{ 
    int itemIndex = rand.Next(0, entries.Length); 
    Console.WriteLine("What year did {0} happen?", entries[itemIndex][1]); 
    string answer = Console.ReadLine(); 
    if(answer == "exit") 
     break; 
    if(answer == entries[itemIndex][0]) 
     Console.WriteLine("You got it!"); 
    else 
     Console.WriteLine("You should study more..."); 
} 
0

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

//Read the entire file into a string array, with each element being one line 
//Note that the variable 'file' is of type string[] 
var file = File.ReadAllLines(@"C:\somePath.yourFile.txt"); 

var events = (from line in file //For every line in the string[] above 
       where !String.IsNullOrWhiteSpace(line) //only consider the items that are not completely blank 
       let pieces = line.Split(',') //Split each item and store the result into a string[] called pieces 
       select new[] { pieces[0], pieces[1].Trim() }).ToList(); //Output the result as a List<string[]>, with the second element trimmed of extra whitespace 

Если вам необходимо получить доступ к первой записи, вы можете сделать это так:

var firstYear = events[0][0]; 
var firstDescription = events[0][1]; 

разбив его ...

  • ReadAllLines просто открывает файл, считывает содержимое в массив, и закрывает его.

  • LINQ заявление:

    • перебирает каждую строку, это не пустой
    • расколов каждую строку на запятой и создает переменные временную (штуки), чтобы сохранить текущую строку в
    • магазинах содержимое разделительной линии в массиве
    • делает это для каждой строки и сохраняет окончательные результаты в списке - поэтому у вас есть список массивов
+1

Если вы собираетесь разделить на один символ, нет необходимости в создании массива в вашем вызове 'line.Split(). – dodexahedron

+0

@dodexahedron Спасибо, хорошая точка. Первоначально я использовал перегрузку StringSplitOptions, которая требует массив. –

+0

Да, я почти прокомментировал это, но потом увидел, что вы тоже удалили это. :) – dodexahedron

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