C# 读取文件中的第一行和最后一行
我需要在.NET4.5应用程序中读取日志文件的第一行和最后一行 ,即。C# 读取文件中的第一行和最后一行,c#,.net,file-io,C#,.net,File Io,我需要在.NET4.5应用程序中读取日志文件的第一行和最后一行 ,即。 日志文件的每一行都有时间戳,我想找到最年轻(第一行)和最老(最后一行)的时间戳。这不是一项困难的任务,但我想知道是否有一种聪明的方法来完成它 当前的实现看起来是这样的(我实际上需要日志文件的第二行,因为第一行是空的,因此Skip()): 这个非常简单的代码有什么改进吗?在一个IEnumerable中读一次,然后将其用于第二行和最后一行 var lines = File.ReadLines(logFile); string f
日志文件的每一行都有时间戳,我想找到最年轻(第一行)和最老(最后一行)的时间戳。这不是一项困难的任务,但我想知道是否有一种聪明的方法来完成它 当前的实现看起来是这样的(我实际上需要日志文件的第二行,因为第一行是空的,因此
Skip()
):
这个非常简单的代码有什么改进吗?在一个
IEnumerable
中读一次,然后将其用于第二行和最后一行
var lines = File.ReadLines(logFile);
string firstLine = lines.Skip(1);
string lastLine = lines.Last();
在当前代码中,您要读取两次,如果您希望在第一次读取和第二次读取之间修改文件,那么您必须读取两次文件 在
IEnumerable
中读取一次,然后将其用于第二行和最后一行
var lines = File.ReadLines(logFile);
string firstLine = lines.Skip(1);
string lastLine = lines.Last();
在当前代码中,您要读取两次,如果您希望在第一次读取和第二次读取之间修改文件,那么您必须读取两次文件 最明显的解决方案File.ReadLines已经找到了 对于大文件,另一种选择是: 从这里开始的ReverseLineReader类:
我们已经找到了最明显的解决方案File.ReadLines 对于大文件,另一种选择是: 从这里开始的ReverseLineReader类:
定义“改进”。Habib的答案对于小文件非常有用。但是,对于非常大的文件,速度会非常慢。但加快速度是一件很重要的事情。最后,您将以二进制形式读取文件的结尾,并向后处理到最后一行的开头。看看您是否真的感兴趣。Skip(1)表示它返回第一个元素之后的其余元素。我猜你是第一个()?@JimMischel提高了执行时间,内存紧随其后。由于总是最好针对最常见的情况进行优化,我可以说,大多数文件的大小大约为~5MB或更少,在极端情况下大约为25MB(~200k行)。我还可以对其中20-30个文件进行解析。我在前面回顾了阅读,同意这看起来“相当棘手”,如果可能的话,我会避免。当前的解决方案不是“慢”的,如果大多数文件都是5MB,那么我可能会使用Habib的方法。加载几个大文件可能需要1/2秒(如果需要的话)。但如果你所拥有的足够快,那么我会同意。定义“改进”。Habib的答案对于小文件非常有用。但是,对于非常大的文件,速度会非常慢。但加快速度是一件很重要的事情。最后,您将以二进制形式读取文件的结尾,并向后处理到最后一行的开头。看看您是否真的感兴趣。Skip(1)表示它返回第一个元素之后的其余元素。我猜你是第一个()?@JimMischel提高了执行时间,内存紧随其后。由于总是最好针对最常见的情况进行优化,我可以说,大多数文件的大小大约为~5MB或更少,在极端情况下大约为25MB(~200k行)。我还可以对其中20-30个文件进行解析。我在前面回顾了阅读,同意这看起来“相当棘手”,如果可能的话,我会避免。当前的解决方案不是“慢”的,如果大多数文件都是5MB,那么我可能会使用Habib的方法。加载几个大文件可能需要1/2秒(如果需要的话)。但是如果你有足够快的速度,那我就用它。
行
不是数组,它是一个IEnumerable
。这比读入数组要好,它只会让您的文档有点混乱。那么,当我调用ReadLines
两次时,会发生什么呢?整个文件会被读取两次吗?@valsidav:不会,整个文件不会被读取两次。但是,系统必须打开文件两次,这并不便宜。行
不是数组,而是IEnumerable
。这比读入数组要好,它只会让您的文档有点混乱。那么,当我调用ReadLines
两次时,会发生什么呢?整个文件会被读取两次吗?@valsidav:不会,整个文件不会被读取两次。但是,系统必须打开文件两次,这并不便宜。