C# 删除.txt文件中的所有行,以特定单词开头的行除外

C# 删除.txt文件中的所有行,以特定单词开头的行除外,c#,C#,我正在尝试创建一个程序,该程序将读取文本文件中的所有行并删除所有文本,但以“行1:、行2:、行3:”等开头的行除外 UPDATE 谢谢你的建议。以下是最终工作代码: //PROCEDURE private void Procedure() { // READ AND APPEND LINES var file_path = @"Tags.txt"; var sb = new StringBu

我正在尝试创建一个程序,该程序将读取文本文件中的所有行并删除所有文本,但以“行1:、行2:、行3:”等开头的行除外

UPDATE
谢谢你的建议。以下是最终工作代码:

//PROCEDURE
        private void Procedure()
        {
            // READ AND APPEND LINES
            var file_path = @"Tags.txt";
            var sb = new StringBuilder();
            foreach (var line in File.ReadLines(file_path))
            {
                if (Regex.IsMatch(line, @"^Line\s+[0-9]+:") || (Regex.IsMatch(line, @"^Zeile\s+[0-9]+:") || (Regex.IsMatch(line, @"^Linea\s+[0-9]+:"))))
                {
                    sb.AppendLine(line);
                }
            }

            // SAVE BACK
            File.WriteAllText(file_path, sb.ToString());
        }

        private void btnRefine_Click(object sender, RoutedEventArgs e)
        {
            Procedure();
        }
对代码的任何改进都是受欢迎的

void ProcessFile()
{
    var file_path = @"Tags.txt";
    var sb = new StringBuilder();
    foreach (var line in File.ReadLines(file_path))
    {
        if (!Regex.IsMatch(line, @"^Line\s+[0-9]+:"))
        {
            sb.AppendLine(line);
        }
    }
    // Save back
    File.WriteAllText(file_path, sb.ToString());
}
使现代化 你可以用LINQ代替。那么前面的代码将如下所示:

void ProcessFile()
{
    var file_path = @"Tags.txt";
    File.WriteAllLines(file_path, File.ReadLines(file_path).Where(line => !Regex.IsMatch(line, @"^Line\s+[0-9]+:")));
}
使现代化 你可以用LINQ代替。那么前面的代码将如下所示:

void ProcessFile()
{
    var file_path = @"Tags.txt";
    File.WriteAllLines(file_path, File.ReadLines(file_path).Where(line => !Regex.IsMatch(line, @"^Line\s+[0-9]+:")));
}

将所有行作为列表获取后,您只需使用RemoveAll删除如下行

List<string> lines = new List<string> (File.ReadAllLines("Tags.txt"));
lines.RemoveAll(line => !Regex.IsMatch(line, @"^Line\s+\d+:");
using (StreamWriter fw = new StreamWriter(new FileStream("TagsNew.txt", FileMode.CreateNew, FileAccess.Write)))
{
   foreach (string line in lines)
   {
       fw.WriteLine(line);
   }
}

希望这能有所帮助。

将所有行作为列表获取后,您只需使用RemoveAll来删除这样的行

List<string> lines = new List<string> (File.ReadAllLines("Tags.txt"));
lines.RemoveAll(line => !Regex.IsMatch(line, @"^Line\s+\d+:");
using (StreamWriter fw = new StreamWriter(new FileStream("TagsNew.txt", FileMode.CreateNew, FileAccess.Write)))
{
   foreach (string line in lines)
   {
       fw.WriteLine(line);
   }
}
希望这有帮助。

我会利用和来做文件IO。它们很方便,因为它们允许您在文件的所有行上轻松地使用LINQ样式的操作。这是以将整个文件读入内存为代价的,对于一个大小为GB的文件来说,这可能是不实际的

LINQ Where子句允许您根据所选谓词筛选行

保持一条线的标准是它从您的第123行:模式开始。可以使用诸如^Line\s+\d+之类的正则表达式来表达。这基本上要求行以行开头,后跟一些空格,后跟一些数字,然后是冒号。将允许您测试每一行是否与正则表达式匹配

这是一条单行线:

File.WriteAllLines("output.txt", File.ReadAllLines("input.txt")
    .Where(line => Regex.IsMatch(line, "^Line\s+\d+:")));
我会利用和来做文件IO。它们很方便,因为它们允许您在文件的所有行上轻松地使用LINQ样式的操作。这是以将整个文件读入内存为代价的,对于一个大小为GB的文件来说,这可能是不实际的

LINQ Where子句允许您根据所选谓词筛选行

保持一条线的标准是它从您的第123行:模式开始。可以使用诸如^Line\s+\d+之类的正则表达式来表达。这基本上要求行以行开头,后跟一些空格,后跟一些数字,然后是冒号。将允许您测试每一行是否与正则表达式匹配

这是一条单行线:

File.WriteAllLines("output.txt", File.ReadAllLines("input.txt")
    .Where(line => Regex.IsMatch(line, "^Line\s+\d+:")));

这里的问题是,你没有描述你以后想用这些行做什么-你是在屏幕上打印吗?保存到另一个文件?将其转发到另一个函数?我对C语言不太熟悉,所以在循环文本和追加行方面,我不知道如何做到这一点。我以后不需要使用这些行,但文本文件中只保留以“Line 1:”开头的行。也许将它们重新写入一个单独的文件会更容易。你不能用这种方式直接修改文件。你必须写一个新文件,然后将其重命名为旧文件。当你想删除内容时,只有在二进制模式下,当你用相同字节数替换内容时,更改文件才会起作用。因此,在你的情况下,创建一个新的列表/数组并将它们放入一个新文件是很容易的。我投票将这个问题作为离题题结束,因为这个问题属于on。这就是你所需要的:File.writeAllinesFile_path,File.ReadAllLinesfile_path.Whereline=>Regex.IsMatchline,…|Regex.IsMatchline,…| |。。。;这里的问题是,你没有描述你以后想用这些行做什么-你是在屏幕上打印吗?保存到另一个文件?将其转发到另一个函数?我对C语言不太熟悉,所以在循环文本和追加行方面,我不知道如何做到这一点。我以后不需要使用这些行,但文本文件中只保留以“Line 1:”开头的行。也许将它们重新写入一个单独的文件会更容易。你不能用这种方式直接修改文件。你必须写一个新文件,然后将其重命名为旧文件。当你想删除内容时,只有在二进制模式下,当你用相同字节数替换内容时,更改文件才会起作用。因此,在你的情况下,创建一个新的列表/数组并将它们放入一个新文件是很容易的。我投票将这个问题作为离题题结束,因为这个问题属于on。这就是你所需要的:File.writeAllinesFile_path,File.ReadAllLinesfile_path.Whereline=>Regex.IsMatchline,…|Regex.IsMatchline,…| |。。。;非常感谢您的建议,这非常有效。非常感谢您的建议,这非常有效。这是以将整个文件读入内存为代价的—对于大小为GB的文件来说,这可能不太实际。这就是为什么需要使用File.ReadLines@JohnyL,你完全正确。此外,如果您不想将文件的整个剩余部分存储在内存中,则不应使用StringBuilder,也不应使用file.WriteAllText。这会导致整个文件被读入内存,这对于一个不太实用的文件来说可能是不可行的
大小为ny GB。这就是为什么需要使用File.ReadLines@JohnyL,你完全正确。另外,如果不想将文件的整个剩余部分存储在内存中,则不应使用StringBuilder,也不应使用file.WriteAllText.庆幸我能提供帮助。起初,我实际上错过了您指定的第1行、第2行等模式的要点。因此,我更新了代码以删除模式中出现的单词。很高兴我能提供帮助。起初,我实际上错过了您指定的第1行、第2行等模式的要点。所以,我更新了代码以删除模式中出现的单词。