C# 删除文本文件中的行

C# 删除文本文件中的行,c#,C#,嗨,我有一个带有表模式和数据的文本文件,当用户检查不需要模式时,我需要删除模式并保留数据。我正在使用StreamReader读取文件并检查一个条件,它应该删除文件中的所有行,直到满足我的条件。 假设我正在检查 using (StreamReader tsr = new StreamReader(targetFilePath)) { do { string textLine = tsr.ReadLi

嗨,我有一个带有表模式和数据的文本文件,当用户检查不需要模式时,我需要删除模式并保留数据。我正在使用StreamReader读取文件并检查一个条件,它应该删除文件中的所有行,直到满足我的条件。 假设我正在检查

  using (StreamReader tsr = new StreamReader(targetFilePath))
        {
            do
            {
                string textLine = tsr.ReadLine() + "\r\n";

                {
                    if (textLine.StartsWith("INSERT INTO"))
                    {

                         // It should leave these lines 
                        // and no need to delete lines 
                    }

                    else
                    {
                      // it should delete the lines 
                    }

                }
            }
            while (tsr.Peek() != -1);
            tsr.Close();  

请建议我如何删除行,并注意如果textline发现“InsertInto”,则不应删除其中的任何内容

使用第二个文件,只在其中放置所需的行,并在过程结束时删除原始文件并将新文件重命名为目标文件

using (StreamReader tsr = new StreamReader(targetFilePath))
{
    using (StreamWriter tsw = File.CreateText(targetFilePath+"_temp"))
    {
         string currentLine;
         while((currentLine = tsr.ReadLine()) != null)
         {
             if(currentLine.StartsWith("A long time ago, in a far far away galaxy ..."))
             {
                    tsw.WriteLine(currentLine);
             }
         }
    }
}
File.Delete(targetFilePath);
File.Move(targetFilePath+"_temp",targetFilePath);
您可以使用Linq:

File.WriteAllLines(targetFilePath, File.ReadAllLines(targetFilePath).Where(x => x.StartsWith("INSERT INTO")));

你读文件的方式和你读的一样。但是,如果该行不包含您要查找的内容,您可以直接跳过它。最后,剩下的任何数据都会写入一个新的文本文件

            private void button1_Click(object sender, EventArgs e)
    {
        StringBuilder newText = new StringBuilder();
        using (StreamReader tsr = new StreamReader(targetFilePath))
        {
            do
            {
                string textLine = tsr.ReadLine() + "\r\n";

                {
                    if (textLine.StartsWith("INSERT INTO"))
                    {

                        newText.Append(textLine + Environment.NewLine);
                    }

                }
            }
            while (tsr.Peek() != -1);
            tsr.Close();
        }

        System.IO.TextWriter w = new System.IO.StreamWriter(@"C:\newFile.txt");
        w.Write(newText.ToString());
        w.Flush();
        w.Close();
    }

您应该使用StringBuilder而不是连接字符串。。。。根据行数的不同,它可能会更多efficient@Evan:谢谢Evan的回答您的方法很好,但在极端情况下,这一行代码的内存占用至少与整个文件大小一样大(字符集可以提高此值)。幸运的是,拥有100GB的文本文件并不常见;)@史蒂文:没错,这就是你为不使用临时文件而付出的代价。在这种情况下,所有东西都必须加载到内存中。或者可以使用
FileReadLines()
写入临时文件,然后将其复制过来。即使是5MB的文档也不常见。。。用今天的电脑。这不是什么大问题。它甚至可以作为一行一行地工作的过早优化;)可以通过重命名原始文件而不是删除它来改进此代码,以防出现异常。