#c# #streamreader
#c# #streamreader
Вопрос:
Возможно ли выполнить цикл для каждой строки в файле и проверить, как она заканчивается (LF / CRLF):
using(StreamReader sr = new StreamReader("TestFile.txt"))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.contain("rn")
{
Console.WriteLine("CRLF");
}
else if (line.contain("n")
{
Console.WriteLine("LF");
}
}
}
Комментарии:
1.
ReadLine
собирается удалить ограничитель строки, поэтому вам нужно будет выполнить чтение и проверить наличие символов, завершающих строку.2. не могли бы вы привести мне пример, пожалуйста
3. Как бы вы хотели, чтобы он обрабатывал это, если файл содержит оба типа окончаний строк?
4. Я помещу это в файл журнала, каждая строка с его концом
5. @user2848242
I will put it in a log file, each line whith its end
это приведет к разрыву строк файла журнала
Ответ №1:
Вам нужно будет использовать Read
, чтобы получить каждый символ и проверить наличие окончаний строки. Вам также нужно будет отслеживать, видели ли вы возврат каретки, чтобы вы знали, имеете ли вы дело с CRLF или просто с LF, когда видите перевод строки. И вам нужно будет проверить завершающий CR после завершения цикла.
using(StreamReader sr = new StreamReader("TestFile.txt"))
{
bool returnSeen = false;
while (sr.Peek() >= 0)
{
char c = sr.Read();
if (c == 'n')
{
Console.WriteLine(returnSeen ? "CRLF" : "LF");
}
else if(returnSeen)
{
Console.WriteLine("CR");
}
returnSeen = c == 'r';
}
if(returnSeen) Console.WriteLine("CR");
}
Примечание. вы можете создавать строки из прочитанных символов, и вы можете изменить это, чтобы использовать перегрузку Read
этого чтения в буфер и искать в результате терминаторы строк для повышения производительности.
Ответ №2:
вы можете использовать этот код:
private const char CR = 'r';
private const char LF = 'n';
private const char NULL = (char)0;
public static long CountLines(Stream stream)
{
//Ensure.NotNull(stream, nameof(stream));
var lineCount = 0L;
var byteBuffer = new byte[1024 * 1024];
var prevChar = NULL;
var pendingTermination = false;
int bytesRead;
while ((bytesRead = stream.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
for (var i = 0; i < bytesRead; i )
{
var currentChar = (char)byteBuffer[i];
if (currentChar == NULL) { continue; }
if (currentChar == CR || currentChar == LF)
{
if (prevChar == CR amp;amp; currentChar == LF) { continue; }
lineCount ;
pendingTermination = false;
}
else
{
if (!pendingTermination)
{
pendingTermination = true;
}
}
prevChar = currentChar;
}
}
if (pendingTermination) { lineCount ; }
return lineCount;
}