Определите, какое окончание строки используется в текстовом файле

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

9
задан charles ross 24 January 2019 в 05:17
поделиться

7 ответов

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

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

  • Сканируйте вперед, пока не найдете CR или LF.
  • Если вы читаете CR, загляните вперед к следующему символу;
  • Если следующий символ - LF, использовать его (в противном случае - вернуть обратно).
13
ответ дан 4 December 2019 в 12:16
поделиться

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

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

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

0
ответ дан 4 December 2019 в 12:16
поделиться

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

2
ответ дан 4 December 2019 в 12:16
поделиться

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

0
ответ дан 4 December 2019 в 12:16
поделиться

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

0
ответ дан 4 December 2019 в 12:16
поделиться

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

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

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

2
ответ дан 4 December 2019 в 12:16
поделиться

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

Если это чтение, я обычно ищу \n (Edit: apperantly there are some using only \r) и предполагаю, что строка заканчивается там.

0
ответ дан 4 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: