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 字符串与文本文件进行比较,以便它可以按正确的顺序放置?PS 文本文件中有超过 10,000 名学生。

这些是文本文件的前 5 行:

students (LIST
(LIST (LIST 'Abbott 'A_____ 'J ) 'NONE 'xxxxx@mail.usi.edu 2.3073320999676614 )
(LIST (LIST 'Abbott 'B_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.1915725161177115 )
(LIST (LIST 'Abbott 'R_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.448215586562192 )
(LIST (LIST 'Abel 'H_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.2517764202656974 )
 ) ) <- this is at the end
4

3 回答 3

2

简单的方法是:

  1. 在换行符处拆分字符串
  2. 创建一个包含源代码行的列表
  3. 将新学生添加到列表中
  4. 对列表进行排序
  5. 将列表写入文件

交替:

  1. 在换行符处拆分字符串
  2. 创建一个包含源代码行的列表
  3. 将行写回文件 util 您找到新记录的位置
  4. 写入新记录
  5. 写下其余的记录。

或者,对于大文件甚至更好:

  1. 逐行读取源文件
  2. 将行写入临时目标文件
  3. 当您找到插入新记录的正确位置时,将其写入 dest 文件。
  4. 继续将行从源复制到目标
  5. 删除源文件并重命名目标文件以取而代之。
于 2013-11-07T19:18:38.190 回答
0

假设文本文件每行包含一个学生,您可以将文本文件读入字符串列表,然后添加新学生,然后对其进行排序并将其写回文件。

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

这是低效的,因为每次它读取和写入整个文件。如果您有选择,请考虑使用其他人建议的数据库。

编辑:

由于文件的第一行不是学生,因此您应该在排序之前将其删除,然后再重新添加。

您可以像这样删除该行:

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

并像这样重新添加它:

allStudents.Insert(0, line);
于 2013-11-07T19:21:55.327 回答
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);

可能对你有用

于 2013-11-07T19:23:41.117 回答