C# 如何删除文本文件中特定文本下方的所有行?
我有一个代码,它遍历整个文本文件,搜索特定的文本“[名称]”,并“尝试”删除文本下面的所有行。我尝试了File.writealText(INILoc,string.Empty);,但这只会删除整个文本文件中的所有内容。如何使“[名称]”下面的所有行都被删除 我设置了如下迭代: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)
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当然它给了你一个错误,你试图两次传输同一个文件。我提供了一个解决方案,它允许您在保持使用流的性能的同时写入同一个文件。