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

时间:2019-06-29 11:45:10

标签: c#

我正在尝试创建一个程序,该程序将从文本文件中读取所有行并删除所有文本,除了以“第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();
        }

总是欢迎对代码进行任何改进。

3 个答案:

答案 0 :(得分:3)

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]+:")));
}

答案 1 :(得分:0)

将所有行作为列表获取后,您可以简单地使用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);
   }
}

希望这会有所帮助。

答案 2 :(得分:0)

我将使用File.ReadAllLinesFile.WriteAllLines进行文件IO。它们很方便,因为它们使您可以轻松地在文件的所有行上使用LINQ样式的操作。这是以将整个文件读入内存为代价的-对于大小为GB的文件来说,这可能不切实际。

LINQ Where子句允许您根据选择的谓词过滤行。

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

这里是单线:

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