3 回答
TA贡献2021条经验 获得超8个赞
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]+:")));
}
TA贡献2080条经验 获得超4个赞
我会利用File.ReadAllLines和File.WriteAllLines来执行文件 IO。它们很方便,因为它们允许您轻松地对文件的所有行使用 LINQ 样式的操作。这是以将整个文件读入内存为代价的——这对于大小为许多 GB 的文件可能不切实际。
LINQWhere
子句允许您根据您选择的谓词过滤行。
保持一条线的标准是它以你的Line 123:
模式开始。这可以使用像 . 这样的正则表达式来表达 ^Line\s+\d+:
。这基本上要求该行Line
以一些空格开头,然后是一些数字,然后是一个冒号。 Regex.IsMatch将允许您测试每一行是否与正则表达式匹配。
这是一个单行:
File.WriteAllLines("output.txt", File.ReadAllLines("input.txt") .Where(line => Regex.IsMatch(line, "^Line\s+\d+:")));
TA贡献1890条经验 获得超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);
}
}
希望这可以帮助。
- 3 回答
- 0 关注
- 178 浏览
添加回答
举报