一种在C#中读取文件最后一行的高性能方法
本文关键字:一行 高性能 方法 最后 一种 读取 文件 | 更新日期: 2023-09-27 18:24:02
知道如何用'n
读取包含约30行的文件的最后一行或最后两行,并关注性能速度吗?
编辑:比更快的东西
string[] splitedArray= input.Split(''n');
string lastLine = splitedArray[splitedArray.Length-1];
使用c#
从我的头顶
string lastline = input.Substring(
input.LastIndexOf(''n'));
如果你创建了一个新的IO.FileStream()对象,有一个.Seek()方法可以让你指定文件的结尾作为你想要查找的部分。然而,在这一点上,没有直接的方法可以查看最后一行的起始位置。你必须向后走寻找一条线,或者如果你知道最后一条线是什么样子的(因此知道它有多长),你可能可以猜测你需要向后走多远,然后再往前走一点。使用FileStream.CanSeek属性来确定当前实例是否支持查找。有关更多信息,请参阅Stream.CanSeek.
FileStream fileStream = new FileStream(fileName, FileMode.Open)
// Set the stream position to the end of the file.
fileStream.Seek(0, SeekOrigin.End);
然后循环,直到你得到你的/n
您还可以阅读其他问题:如何在C#中使用迭代器反向读取文本文件
如果您在读取任何文件时需要更好的性能,您可以进行内存映射文件读取/写入,即在低级别API下工作。
(注意:这不是C#,而是VB.NET)我翻译了几年前为Python创建的一个函数。不确定是否只搜索'n
是最佳选择。。。
Public Function tail(ByVal filepath As String) As String
' @author marco sulla (marcosullaroma@gmail.com)
' @date may 31, 2016
Dim fp As String = filepath
Dim res As String
Using f As FileStream = File.Open(fp, FileMode.Open, FileAccess.Read)
Dim f_info As New FileInfo(fp)
Dim size As Long = f_info.Length
Dim start_pos As Long = size - 1
If start_pos < 0 Then
start_pos = 0
End If
If start_pos <> 0 Then
f.Seek(start_pos, SeekOrigin.Begin)
Dim mychar As Integer = f.ReadByte()
If mychar = 10 Then ' newline
start_pos -= 1
f.Seek(start_pos, SeekOrigin.Begin)
End If
If start_pos = 0 Then
f.Seek(start_pos, SeekOrigin.Begin)
Else
mychar = -1
For pos As Long = start_pos To 0 Step -1
f.Seek(pos, SeekOrigin.Begin)
mychar = f.ReadByte()
If mychar = 10 Then
Exit For
End If
Next
End If
End If
Using r As StreamReader = New StreamReader(f, Encoding.UTF8)
res = r.ReadLine()
End Using
End Using
Return res
End Function