我正在逐行读取文件,我想编辑一些我读过的行。 我想编辑的行必须在它们之上或之下有一些其他特定的行,但我不知道如何在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
有什么想法吗?
答案 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
行。
第二种方法更灵活(允许您根据当前行设置和取消设置多个标记),如果Sports
和Clips
之间可能存在多行粗线,则效果很好。它实际上是一个可怜的勒芒State Machine
答案 2 :(得分:1)
如果文件不是那么大,我会将整个文件作为字符串读取。然后你可以使用indexOf和substring等方法自由地操作它。
一旦你有了你需要它的字符串,就把它写回你拥有的文件。