Чтение строк с определенной последовательностью символов новой строки с помощью StreamReader.ReadLine

#c# #stream #delimiter #streamreader #readline

#c# #поток #разделитель #streamreader #readline

Вопрос:

Иногда нам нужно читать строки из потока, но рассматривать только определенную последовательность символов в качестве новой строки (CRLF, но не CR или LF).

StreamReader.ReadLine как задокументировано, обрабатывает как последовательность символов новой строки CRLF, CR и LF. Это может быть неприемлемо, если строка может содержать один CR (» r») или один LF (» n») в качестве бизнес-данных.

Необходимо иметь возможность читать поток построчно, но разделенный определенной последовательностью символов.

Ответ №1:

Вот метод, который считывает строку из потока и возвращает ее в виде строки:

     public static string ReadLineWithFixedNewlineDelimeter(StreamReader reader, string delim)
    {
        if (reader.EndOfStream)
            return null;
        if (string.IsNullOrEmpty(delim))
        {
            return reader.ReadToEnd();
        }
        var sb = new StringBuilder();
        var delimCandidatePosition = 0;
        while (!reader.EndOfStream amp;amp; delimCandidatePosition < delim.Length)
        {
            var c = (char)reader.Read();
            if (c == delim[delimCandidatePosition])
            {
                delimCandidatePosition   ;
            }
            else
            {
                delimCandidatePosition = 0;
            }
            sb.Append(c);
        }
        return sb.ToString(0, sb.Length - (delimCandidatePosition == delim.Length ? delim.Length : 0));
    }