0

我正在逐行读取文件,我想编辑我读到的一些行。我要编辑的行必须在它们的上方或下方有一些其他特定的行,但我不知道如何在 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 

有任何想法吗?

4

3 回答 3

6

您不能真正逐行“编辑”文件。最好采用以下两种方法之一:

  • 将整个文件读入内存,例如 using File.ReadAllLines,然后在内存中进行适当的更改并重写整个文件(例如 using 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);
于 2011-11-08T14:51:19.743 回答
2

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

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

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

于 2011-11-08T14:57:44.337 回答
1

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

一旦你有你需要的字符串,把它写回你拥有的文件。

于 2011-11-08T14:51:22.177 回答