我在stackoverflow上发现了这个代码,用于删除文本文件中的第一行和最后一行。
但是我没有得到如何将这个代码合并为一个,以便它将删除1st和 单个文件的最后一行?
我尝试使用streamreader读取文件,然后跳过第1行和最后一行 要在新文件中写入,但无法获得正确的结构。
删除第一行。
var lines = System.IO.File.ReadAllLines("test.txt");
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
删除最后一行。
var lines = System.IO.File.ReadAllLines("...");
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray());
答案 0 :(得分:20)
您可以链接Skip
和Take
方法。请记住在Take
方法中减去适当的行数。你在开头跳过的越多,剩余的线就越少。
var filename = "test.txt";
var lines = System.IO.File.ReadAllLines(filename);
System.IO.File.WriteAllLines(
filename,
lines.Skip(1).Take(lines.Length - 2)
);
答案 1 :(得分:4)
虽然在这种情况下可能不是主要问题,但现有的答案都依赖于首先将文件的全部内容读入内存。对于小文件,这可能没问题,但是如果你使用非常大的文件,这可能会让人望而却步。
创建SkipLast
等效的现有Skip
Linq方法是相当简单的:
public static class SkipLastExtension
{
public static IEnumerable<T> SkipLast<T>(this IEnumerable<T> source, int count)
{
var queue = new Queue<T>();
foreach (var item in source)
{
queue.Enqueue(item);
if (queue.Count > count)
{
yield return queue.Dequeue();
}
}
}
}
如果我们还定义了一个方法,允许我们枚举文件的每一行而不预先缓冲整个文件(per:https://stackoverflow.com/a/1271236/381588):
static IEnumerable<string> ReadFrom(string filename)
{
using (var reader = File.OpenText(filename))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
然后我们可以使用以下一行代码来编写一个新文件,其中包含原始文件中的所有行,除了第一行和最后一行:
File.WriteAllLines("output.txt", ReadFrom("input.txt").Skip(1).SkipLast(1));
这无疑(相当多)代码已经在此处发布了其他答案,但应该适用于基本上任何大小的文件,(以及为可能有用的SkipLast
扩展方法提供代码)。
答案 2 :(得分:1)
以下是另一种使用ArraySegment<string>
的方法:
var lines = File.ReadAllLines("test.txt");
File.WriteAllLines("test.txt", new ArraySegment<string>(lines, 1, lines.Length-2));