0

我有一个这样的文本文件:

你好
这是文本文件
 * 你能告诉我什么是
 * Dnt 护理
 * 项目清单

我想删除所有带星号(*)的行,所以删除后文件中的结果是:

你好
这是文本文件
4

4 回答 4

5

LINQ 使这变得简单:

using System.IO;
using System.Linq;

...

File.WriteAllLines("output.txt",
                   File.ReadLines("input.txt")
                       .Where(line => !line.Contains("*")));

或者作为两个语句 - 它仍然很懒,一次只读取一行:

var query = File.ReadLines("input.txt").Where(line => !line.Contains("*"));
File.WriteAllLines("output.txt", query);

如果您确实需要替换原始文件,您可以使用上述方法,然后删除原始文件并将新文件移动到位,或者(如果文件足够小)读取整个文件以开始:

var lines = File.ReadAllLines("file.txt").Where(line => !line.Contains("*"));
File.WriteAllLines("file.txt", lines);

请注意,因为它使用ReadAllLines而不是ReadLines,它将一次性将整个文件读入内存。

这是假设您使用的是 .NET 4 或更高版本。如果你只使用 .NET 3.5,你仍然可以使用第二种形式,但你需要将结果转换为数组,然后再写出来:

var lines = File.ReadAllLines("file.txt")
                .Where(line => !line.Contains("*"))
                .ToArray();
File.WriteAllLines("file.txt", lines);
于 2013-03-20T19:33:29.610 回答
2

假设您知道如何从文件中读取和写入内容,您可以使用 aRegex删除您不想要的行。这样做的好处是它要求 * 位于行的开头,而不是只出现在它的任何位置。

Regex.Replace(fileContents, "(?m)(^\s*\*.*$)", "");

Regex在 * 前面有可选数量的空格。

于 2013-03-20T19:37:37.050 回答
1

读取文件中的行:

string[] lines = File.ReadAllLines(filename);

过滤掉带星号的行:

string[] filtered = lines.Where(s => !s.Trim().StartsWith("*")).ToArray();

将剩余的行写入文件:

File.WriteAllLines(filename, filtered);
于 2013-03-20T19:34:33.483 回答
0

逐行查看字符串是否包含 *

while(Reader.CanRead())
{
   string currLine = reader.ReadLine();
   if(currLine.Contains("*") == false)
       list.Add(currLine);
}
于 2013-03-20T19:34:39.547 回答