#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));
}