我正在尝试创建一个程序,该程序将从文本文件中读取所有行并删除所有文本,除了以“第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();
}
总是欢迎对代码进行任何改进。
答案 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.ReadAllLines和File.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+:")));