Определяет, как каждая строка файла заканчивается на C#

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