2013-11-07 8 views
1

В настоящее время я работаю над кодом, в котором я добавляю ученика в текстовый файл студентов и делаю другие вычисления. Проблема, с которой я столкнулась, - это отсортировать нового ученика в текстовом файле, чтобы он был в правильном месте.Сравнение строки с текстовым файлом

StreamWriter changeFile = new StreamWriter("Students.txt", true); 
if (pos > 0) 
{ 
    changeFile.Close(); 
} 
else 
{ 
    changeFile.WriteLine(newStudent); 
    changeFile.Close(); 
} 

using (StreamReader streamReader = new StreamReader("Students.txt")) 
{ 
    string text = streamReader.ReadToEnd(); 
} 

До сих пор мне удалось изменить текстовый файл на строку, чтобы сравнить 2, но это не в том месте. Какой код я использовал бы, чтобы StreamWriter сравнивал строку newStudent с текстовым файлом, чтобы он мог установить его в правильном порядке? P.S. В текстовом файле более 10 000 учеников.

Это первые 5 строк текстового файла:

students (LIST 
(LIST (LIST 'Abbott 'A_____ 'J) 'NONE '[email protected] 2.3073320999676614) 
(LIST (LIST 'Abbott 'B_____ 'Y) 'NONE '[email protected] 3.1915725161177115) 
(LIST (LIST 'Abbott 'R_____ 'Y) 'NONE '[email protected] 3.448215586562192) 
(LIST (LIST 'Abel 'H_____ 'Y) 'NONE '[email protected] 3.2517764202656974) 
)) <- this is at the end 
+2

Я бы рекомендовал использовать базу данных, если вообще p ossible ... –

+0

Почему вы ограничиваетесь текстовым решением? – Arran

+0

Пожалуйста, покажите нам пример вашего текстового файла, включая любые ограничители, которые вы используете. –

ответ

2

простой метод:

  1. Разделить строку на линии ломает
  2. Создать список, содержащий исходные линии
  3. Добавить нового студента в список
  4. Сортировка списка
  5. Написать список в файл

Альтернативно:

  1. Разделить строку на линии влезает
  2. Создать список, содержащий исходные линии
  3. Запись строки обратно в файл UTIL вас найти позицию для новой записи
  4. Запись новой записи
  5. Напишите остальную запись.

Или, еще лучше для больших файлов:

  1. читать исходный файл строка за строкой
  2. Записывает строку во временный файл назначения
  3. Если вы нашли правильное место для вставки новую запись, записать ее в файл dest.
  4. Продолжить копирование строк из источника в пункт назначения
  5. Удалите исходный файл и переименуйте файл назначения, который займет свое место.
+0

Мне удалось разбить линии, но я не могу сделать это в списке –

+0

Простой. 'var lines = stringFromFile.Split (...). ToList();'. Вам также нужно добавить оператор using для пространства имен 'System.Linq'. –

0

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

var allStudents = new List<string>(File.ReadAllLines("Students.txt")); 
allStudents.Add(newStudent); 
allStudents.Sort(allStudents); 
File.WriteLines("Students.txt", allStudents); 

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

EDIT:

Поскольку первая строка файла не студент, вы должны удалить его перед сортировкой и повторно добавить его позже.

Вы можете удалить эту строку:

var line = allStudents[0]; 
allStudents.RemoveAt(0); 

И снова добавить его так:

allStudents.Insert(0, line); 
+0

Он также не работает. –

+0

В чем проблема? –

+0

Мне удалось заставить его работать, но я могу запускать его только один раз, когда он добавляет строку 0 назад, после этого он пустит пустую строку, из-за которой она запутывается во втором прогоне –

0

что-то вроде

var Students = File.ReadAllText("Students.txt").Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList().Union(new string[] { newStudent }).ToList().Sort(); 
File.WriteAllLines("Students.txt", Students); 

может работать для вас

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