C# 删除文本文件中的行
嗨,我有一个带有表模式和数据的文本文件,当用户检查不需要模式时,我需要删除模式并保留数据。我正在使用StreamReader读取文件并检查一个条件,它应该删除文件中的所有行,直到满足我的条件。 假设我正在检查C# 删除文本文件中的行,c#,C#,嗨,我有一个带有表模式和数据的文本文件,当用户检查不需要模式时,我需要删除模式并保留数据。我正在使用StreamReader读取文件并检查一个条件,它应该删除文件中的所有行,直到满足我的条件。 假设我正在检查 using (StreamReader tsr = new StreamReader(targetFilePath)) { do { string textLine = tsr.ReadLi
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的文档也不常见。。。用今天的电脑。这不是什么大问题。它甚至可以作为一行一行地工作的过早优化;)可以通过重命名原始文件而不是删除它来改进此代码,以防出现异常。