【问题标题】:Comparing string to text file将字符串与文本文件进行比较
【发布时间】:2013-11-07 19:06:55
【问题描述】:

我目前正在编写一个代码,将学生添加到学生的文本文件中并进行其他计算。我遇到的问题是我必须将新学生分类到文本文件中,以便他在正确的位置。

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

【问题讨论】:

  • 我建议尽可能使用数据库...
  • 您为什么要限制自己使用基于文本文件的解决方案?
  • 请向我们展示您的文本文件示例,包括您正在使用的任何轮廓标记。
  • 我刚刚修改了您示例中的数据,不确定其中一些数字是什么,但他们所依附的人可能会关心。
  • 实际上所有的号码、电子邮件和姓名都是假的。所以他们会关心,如果他们是真的哈哈

标签: c# string string-comparison


【解决方案1】:

简单的方法是:

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

交替:

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

或者,对于大文件更好:

  1. 逐行读取源文件
  2. 将行写入临时目标文件
  3. 找到插入新记录的正确位置后,将其写入目标文件。
  4. 继续将行从源复制到目标
  5. 删除源文件并重命名目标文件以取而代之。

【讨论】:

  • 我设法拆分了行,但无法将其放入列表中
  • 简单。 var lines = stringFromFile.Split(...).ToList();。您还需要为 System.Linq 命名空间添加 using 语句。
【解决方案2】:

类似

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);

可能对你有用

【讨论】:

    【解决方案3】:

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

    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);
    

    【讨论】:

    • 我设法让它工作,但我只能运行一次,每当它添加第 0 行时,它会在其后放置一个空行,这会导致它在第二次运行时搞砸跨度>
    • 哦,在代码的末尾有 ) ),你知道我怎样才能删除它吗?我可以把它写回来
    • 要修复空行,请将var line = allStudents[0]; 更改为var line = allStudents[0].Trim(); 要删除最后一行,请执行:var lastLine = allStudents[allStudents.Count - 1].Trim(); 要添加最后一行,请执行:allStudents.Add(lastLine);
    • 我无法获得最后一部分。当我运行它时,我检查文本文件,最后一部分总是切入其余代码
    • 我不明白你的意思。 “切入代码的其余部分”是什么意思? “检查文本文件”是什么意思?您应该在对列表进行排序之前删除第一行和最后一行。然后在保存文件之前将它们都添加回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多