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
任何想法?
你不能一行一行地"编辑"文件。最好采用以下两种方法之一:
- 将整个文件读入内存,例如使用
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
。
第二种方法更加灵活(允许您根据当前行设置和取消设置多个标志),并且如果在Sports
和Clips
之间可能有多行crud,则很好。它实际上是一个穷人状态机
如果文件不是那么大,我会将整个文件作为字符串读入。然后,您可以使用indexOf和substring等方法自由地操作它。
一旦你得到了你所需要的字符串,把它写回你的文件。