c#逐行检查文件

本文关键字:文件 检查 逐行 | 更新日期: 2023-09-27 18:13:44

我正在逐行阅读文件,我想编辑我读到的一些行。我想编辑的行必须在它们上面或下面有一些其他特定的行,但我不知道如何在c#中表达。例如:

http://www.youtube.com
You Tube | Music | something
Sports
Music
Radio
Clips
http://www.youtube.com/EDIT ME   
Sports
Music
Radio
Clips

,我想编辑一行只有当下一行是

Sports 

,前一行是

Clips

所以我想在上面的例子中编辑的唯一一行是

http://www.youtube.com/EDIT ME 

任何想法?

c#逐行检查文件

你不能一行一行地"编辑"文件。最好采用以下两种方法之一:

  • 将整个文件读入内存,例如使用File.ReadAllLines,然后在内存中进行适当的更改并重写整个文件(例如使用File.WriteAllLines)
  • 同时打开输入文件和输出文件。每次读取一行,找出它在输出文件中对应的内容,然后写入该行。

第一个版本更简单,但显然需要更多内存。如果您需要查看下一行和前一行,就像您提到的那样,尤其棘手。

第一种方法的简单示例:

string[] lines = File.ReadAllLines("foo.txt");
for (int i = 1; i < lines.Length - 1; i++)
{
    if (lines[i - 1] == "Clips" && lines[i + 1] == "Sports")
    {
        lines[i] = "Changed";
    }
}
File.WriteAllLines("foo.txt", lines);

方法#1
在循环遍历文件时,为前一行保留一个变量(在循环之前始终将其更新为当前行)。现在您知道了当前行和上一行,您可以决定是否需要编辑当前行。

方法# 2
当你循环遍历文件时,设置一个与某些条件相对应的标志,例如,我刚刚找到Sports。如果你后来发现一个条件,应该取消设置标志,例如,我刚刚发现Radio,取消设置它。如果你发现Clips,你可以检查SportsFlag设置,看看你是否需要编辑这行Clips

第二种方法更加灵活(允许您根据当前行设置和取消设置多个标志),并且如果在SportsClips之间可能有多行crud,则很好。它实际上是一个穷人状态机

如果文件不是那么大,我会将整个文件作为字符串读入。然后,您可以使用indexOf和substring等方法自由地操作它。

一旦你得到了你所需要的字符串,把它写回你的文件。