2016-01-15 5 views
2

Что было бы самым эффективным (быстрым и надежным) способом в JavaScript, чтобы определить тип разрывов строк, используемых в тексте - Unix vs Windows.Обнаружение типа разрывов строк

В приложении моего узла я должен читать в больших текстовых файлах utf-8, а затем обрабатывать их в зависимости от того, используют ли они разрывы строк в Unix или Windows.

Когда тип разрыва строки появляется как неопределенный, я хочу заключить, на основе которого он наиболее вероятен.

+0

Что вы пробовали до сих пор? как выглядит ваш вход? сырой текст? богатый текст? –

+0

Пробовал какое-то уродливое лобовое сканирование. Файлы представляют собой большие текстовые файлы. –

+0

'text.indexOf ('\ r')! == -1'? –

ответ

0

В конце концов я использовал свое собственное решение для этого:

function getLineBreakType(text) { 
    var idx = 0, unix = 0, windows = 0; 
    while (idx < text.length) { 
     idx = text.indexOf('\n', idx); 
     if (idx == -1) { 
      break; 
     } 
     if (idx > 0 && text[idx - 1] === '\r') { 
      windows++; 
     } else { 
      unix++; 
     } 
     idx++; 
    } 
    if (unix === windows) { 
     return 'unknown'; 
    } 
    return unix > windows ? 'unix' : 'windows'; 
} 
1

Так мы обнаруживаем окончания строк в файлах JavaScript с использованием правила ESLint. Источник означает фактическое содержимое файла.

Примечание: Иногда у вас также могут быть файлы со смешанными концами.

https://github.com/eslint/eslint/blob/master/lib/rules/linebreak-style.js

+0

Если лицензия совместима, скопируйте соответствующий код в ответ. Если эта связь сломается, этот ответ станет относительно бесполезным. Кроме того, проверьте правописание :). –

0

Попробуйте

if(text.search(/\r/) > -1 || text.search(/\r\n/) > -1){ 
    alert('Windows'); 
} else if(text.search(/\n/) > -1){ 
    alert('Unix'); 
} else { 
    alert('No line breaks found') 
} 
+0

Когда оба найдены, я хочу заключить, основываясь на которых они нашли больше. –

2

Вы хотели бы посмотреть первую для LF. например, source.indexOf('\n'), а затем посмотреть, является ли символ за ним CR, как source[source.indexOf('\n')-1] === '\r'. Таким образом, вы просто найдете первый пример новой строки и сопоставляете ее. Таким образом,

function whichLineEnding(source) { var temp = source.indexOf('\n'); if (source[temp - 1] === '\r') return 'CRLF' return 'LF' }

Есть два popularish примеров библиотек делают это в НПХ модулях: https://github.com/danielchatfield/node-newline/blob/master/lib/detect.js и https://github.com/Neoklosch/crlf-helper/blob/master/lib/crlfHelper.js Первый делает раскол на всей строке, которая является очень неэффективной в вашем случае. Второе использует регулярное выражение, которое в вашем случае не будет достаточно быстрым.

Однако, из вашего редактирования, если вы хотите определить, какой из них больше. Тогда я бы использовал код от https://github.com/danielchatfield/node-newline/blob/master/lib/detect.js, так как он обрабатывает этот случай.

Смежные вопросы