一种在C#中读取文件最后一行的高性能方法

本文关键字:一行 高性能 方法 最后 一种 读取 文件 | 更新日期: 2023-09-27 18:24:02

知道如何用'n读取包含约30行的文件的最后一行或最后两行,并关注性能速度吗?

编辑:比更快的东西

string[] splitedArray= input.Split(''n');
string lastLine = splitedArray[splitedArray.Length-1];

使用c#

一种在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