Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除文本文件中特定文本下方的所有行?_C#_Loops_Iteration - Fatal编程技术网

C# 如何删除文本文件中特定文本下方的所有行?

C# 如何删除文本文件中特定文本下方的所有行?,c#,loops,iteration,C#,Loops,Iteration,我有一个代码,它遍历整个文本文件,搜索特定的文本“[名称]”,并“尝试”删除文本下面的所有行。我尝试了File.writealText(INILoc,string.Empty);,但这只会删除整个文本文件中的所有内容。如何使“[名称]”下面的所有行都被删除 我设置了如下迭代: string[] lines = File.ReadAllLines(INILoc); bool containsSearchResul = false; foreach (string line in lines)

我有一个代码,它遍历整个文本文件,搜索特定的文本“[名称]”,并“尝试”删除文本下面的所有行。我尝试了File.writealText(INILoc,string.Empty);,但这只会删除整个文本文件中的所有内容。如何使“[名称]”下面的所有行都被删除

我设置了如下迭代:

string[] lines = File.ReadAllLines(INILoc);
bool containsSearchResul = false;
foreach (string line in lines)
    {
         if (containsSearchResul)
           {
                File.WriteAllText(INILoc, string.Empty);

           }
         if (line.Contains("[names]"))
           {
                containsSearchResul = true;
           }
    }

您需要将
“[names]”之前的行存储到字符串变量中,当条件
(line.Contains(“[names]”)满足时,只需中断循环并将字符串值写入同一文件

大概

string[] lines = File.ReadAllLines(INILoc); //Considering INILoc is a string variable which contains file path.
StringBuilder newText = new StringBuilder();
bool containsSearchResul = false;

foreach (string line in lines)
    {
       newText.Append(line);
       newText.Append(Environment.NewLine); //This will add \n after each line so all lines will be well formatted

       //Adding line into newText before if condition check will add "name" into file
       if (line.Contains("[names]"))
              break;

    }

File.WriteAllText(INILoc, newText.ToString());
                        //^^^^^^^ due to string.Empty it was storing empty string into file.

注意:如果您使用的是
StringBuilder
类,请不要错过在程序中使用System.Text
添加
。代码的问题在于,它会删除
[names]
之前的所有行,而不是之后的行(更准确地说,只写该文本之后的行)。此外,任何时候您都可以重写所有文件内容,从而删除所有以前写入的行。它的工作原理如下:

string[] lines = File.ReadAllLines(INILoc);
using (StreamWriter writer = new StreamWriter(INILoc)) // https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-write-text-to-a-file
{
            bool containsSearchResul = false;
            foreach (string line in lines)
            {

                if (!containsSearchResul)
                {
                    writer.Write(INILoc, string.Empty);

                }

                if (line.Contains("[names]"))
                {
                    containsSearchResul = true;
                }
            }
}
您还有另一个更好的选择,可以使用
break

string[] lines = File.ReadAllLines(INILoc);
using (StreamWriter writer = new StreamWriter(INILoc)) // https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-write-text-to-a-file
{
            foreach (string line in lines)
            {
                if (line.Contains("[names]"))
                {
                    break;
                }

                writer.WriteLine(INILoc, string.Empty);
            }
}
但您可以通过使用LINQ以更喜欢、更可读的方式执行此操作:

using System.Linq;

// ...

string[] lines = File.ReadAllLines(INILoc);
string[] linesTillNames = lines
                          .Take( // Take just N items from the array
                              Array.IndexOf(lines, "[names]") // Until the index of [names]
                          )
                          .ToArray();
File.WriteAllLines(INILoc, linesTillNames);

使用
StreamReader
,因为它将为您提供最佳性能,因为您不需要读取整个文件。将“输入文件路径”与文件路径交换,结果将存储在为“输出文件路径”提供的路径中

using (var sr = new StreamReader("PATH TO INPUT FILE"))
{
    using (var sw = new StreamWriter("PATH TO OUTPUT FILE"))
    {
        var line = sr.ReadLine();

        while (line != null)
        {
            sw.WriteLine(line);

            if (line.Contains("[names]"))
            {
                sw.Close();
                sr.Close();
            }
            else
            {                            
                line = sr.ReadLine();
            }                        
        }
    }
}
如果需要写入同一文件:

var sb = new StringBuilder();

using (var sr = new StreamReader("PATH TO INPUT FILE"))
{
    var line = sr.ReadLine();

    while (line != null)
    {
        sb.AppendLine(line);

        if (line.Contains("[names]"))
        {
            sr.Close();
        }
        else
        {
            line = sr.ReadLine();
        }
    }
}

File.WriteAllText("PATH TO INPUT FILE", sb.ToString());

根据所要求的代码,我把修改放在一起

    string[] lines = File.ReadAllLines(INILoc);
    //create a list to hold the lines
    List<string> output = new List<string>();
    //loop through each line
    foreach (string line in lines)
    {
        //add current line to  ouput.
        output.Add(line);
        //check to see if our line includes the searched text;
        if (line.Contains("[names]"))
        {
            //output to the file and then exit loop causing all lines below this 
            //one to be skipped
            File.WriteAllText(INILoc, output.ToArray());
            break;
        }
    }
string[]line=File.ReadAllLines(INILoc);
//创建一个列表来保存行
列表输出=新列表();
//每行循环一次
foreach(行中的字符串行)
{
//将当前行添加到输出。
输出。添加(行);
//检查我们的行是否包含搜索的文本;
if(第行包含(“[名称]”)
{
//输出到该文件,然后退出循环,从而导致此文件下面的所有行
//一个要跳过
File.WriteAllText(INILoc,output.ToArray());
打破
}
}

您也可以这样使用:
writeAllines(字符串路径,IEnumerable内容)

string[] lines = File.ReadAllLines(INILoc);
List<string> linesToWrite = new List<string>();

foreach(string line in lines)
{
    linesToWrite.Add(line);
    if (line.Contains("[names]")) break;
}

File.WriteAllLines(INILoc, linesToWrite);
string[]line=File.ReadAllLines(INILoc);
List linesToWrite=新列表();
foreach(行中的字符串行)
{
linesToWrite.Add(行);
如果(行包含(“[名称]”)中断;
}
File.writeAllines(INILoc、linesToWrite);

欢迎来到StackOverflow!熟悉docs.microsoft.com网站可能需要付费。该方法的描述如下:创建一个新文件,将内容写入该文件,然后关闭该文件。如果目标文件已存在,则会覆盖该文件。正如@Prasad在他的回答中提到的,您传递的是string.Empty,因此您的输出是一个空文件。
文件
类中没有内置的方法来执行此操作,因此您必须像Prasad那样“自己滚动”。谢谢!但现在出现了一个新问题,它最终也删除了[名称],现在文本文件的所有内容都粘贴在一行中。我更新了我的答案,以涵盖您在报告中提到的两种情况comment@ChayimFriedman,我同意你的编辑建议,刚才我添加了单独的代码行来解释
环境背后的原因。NewLine
@prasadelkikikar同样,出于性能原因,最好使用
StringBuilder
而不是
string
。如果输出和输入文件相同怎么办?它给了我一个错误。@ManiacKnight当然它给了你一个错误,你试图两次传输同一个文件。我提供了一个解决方案,它允许您在保持使用流的性能的同时写入同一个文件。