C#逐行检查文件

时间:2011-11-08 14:43:39

标签: c# file-io line-by-line

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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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

  • 将整个文件读入内存,例如使用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)

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

方法#2
在循环浏览文件时,设置对应于某些条件的标志,例如我刚刚找到Sports。如果您以后发现应该取消标记的条件,例如我刚刚找到Radio,未设置它。如果您找到Clips,则可以检查SportsFlag设置是否需要修改此Clips行。

第二种方法更灵活(允许您根据当前行设置和取消设置多个标记),如果SportsClips之间可能存在多行粗线,则效果很好。它实际上是一个可怜的勒芒State Machine

答案 2 :(得分:1)

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

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