Определите, какой конец строки используется в текстовом файле. - PullRequest
9 голосов
/ 10 июня 2010

Какой наилучший способ в C # определить окончания строк, используемые в текстовом файле (Unix, Windows, Mac)?

Ответы [ 7 ]

13 голосов
/ 10 июня 2010

Обратите внимание, что текстовые файлы могут иметь несовместимые окончания строк.Ваша программа не должна подавиться этим.Использование ReadLine на StreamReader (и аналогичных методах) позаботится о любом возможном окончании строки автоматически.

Если вы вручную читаете строки из файла, обязательно примите any окончания строк, даже если они несовместимы.На практике это довольно легко, используя следующий алгоритм:

  • Сканирование вперед, пока не будет найден CR или LF.
  • Если вы читаете CR, загляните вперед на следующий символ;
  • Если следующим символом является LF, уничтожьте его (в противном случае положите обратно).
2 голосов
/ 10 июня 2010

Вот несколько продвинутых догадок: прочитайте файл, посчитайте CR и LFs

if (CR > LF*2) then "Mac" 
else if (LF > CR*2) then "Unix"
else "Windows"

Также обратите внимание, что на более новых Mac (Mac OS X) используется конец строки Unix

1 голос
/ 10 июня 2010

Я бы просто поискал в файле первые \r или \n, и если бы это был \n, я бы посмотрел на предыдущий символ, чтобы увидеть, является ли он \r, если так, то это \r\n В противном случае это будет найдено.

0 голосов
/ 10 июня 2010

Чтение большинства текстовых форматов, которые я обычно ищу, \ n, а затем обрезка () всей строки (пробелы в начале и конце часто бывают избыточными).

0 голосов
/ 10 июня 2010

Если бы это был я, я бы просто читал файл по одному символу за раз, пока не наткнулся на первый \r или \n. Это при условии, что у вас есть чувственный вклад.

0 голосов
/ 10 июня 2010

Я полагаю, вы не могли бы знать наверняка, пришлось бы установить это в редакторе.Вы можете использовать некоторый ИИ, алгоритм будет такой:

  1. Поиск каждого типа окончания строки, вы будете искать эти конкретные символы
  2. Измерение расстояний между ними.
  3. Если один тип имеет тенденцию повторяться, то вы предполагаете, что это тип.Подсчитайте повторы и используйте некоторую меру дисперсии.

Так, например, если у вас были повторы CRLF в 38, 40, 45, и это было в пределах допуска, вы по умолчанию предполагали бы линиюконец был CRLF.

0 голосов
/ 10 июня 2010

Существует Environment.NewLine, хотя это только для определения того, что используется в текущей системе и не поможет с чтением файлов из различных источников.

Если это чтение, я обычно ищу \n (Редактировать: вероятно, некоторые используют только \r) и предположить, что линия заканчивается там.

...