Эффективный способ прочитать последнюю строку файла в C # - PullRequest
0 голосов
/ 11 февраля 2012

есть идеи, как читать последние или две последние строки файла, содержащего около 30 строк, с \n с акцентом на быстродействие?

EDIT: что-то быстрее, чем:

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

Использование c #

Ответы [ 4 ]

11 голосов
/ 11 февраля 2012

с макушки головы

string lastline = input.Substring(
   input.LastIndexOf('\n'));
3 голосов
/ 11 февраля 2012

Если вы создаете новый объект 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 #

1 голос
/ 11 февраля 2012

Если вам нужна лучшая производительность при чтении любого файла, вы можете перейти к чтению / записи файла карты памяти, то есть работать с низкоуровневыми API.

0 голосов
/ 24 июня 2016

(Примечание: это не 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
...