Ruby IO.readlines останавливается перед последней строкой файла

Я использую Ruby 1.9.3 на компьютере с Windows.

Когда я запускаю IO.readlines для файла, я получаю странный и неожиданный результат. Результатом выполнения IO.readlines для файла является массив, который просто заканчивается строкой, которая не является последней строкой в ​​файле. Например, последним элементом массива является эта строка:

MLOGIC(RESPONSE_FREQUENCY):  Parameter NUMERATOR_SUBSET has value \x01where

Это последний элемент в массиве, хотя на самом деле в файле гораздо больше строк.

Когда я запускаю IO.readlines для того же самого файла в OS X, используя Ruby 2.0.0, проблем нет; он читает весь файл в массив, как и ожидалось.

Любая помощь в этом будет принята с благодарностью.


person Glenn    schedule 05.02.2014    source источник


Ответы (1)


Основное отличие IO.readlines (документы 1.9.3 и 2.0.0) в Windows и В OSX используется разделитель строк по умолчанию $/ — в системе unixoid вы обнаружите, что это "\n", а в Windows — "\r\n".

Чтобы получить такое же поведение, вы можете вызвать IO.readlines следующим образом:

arr = IO.readlines('./testfile', "\n")
person DMKE    schedule 05.02.2014
comment
Привет, спасибо за ваш ответ. Я попробовал это, но это не изменило результат. Результат IO.readlines все еще меньше, чем должен быть. Я думаю, что в файле есть шестнадцатеричный символ. Я думаю, что IO.readlines останавливается, когда доходит до этого символа. - person Glenn; 06.02.2014
comment
Ну, это должно не быть. Вы пробовали File.read('./testfile').split("\n")? - person DMKE; 06.02.2014
comment
Я только что попробовал код с разделением. Тот же результат. Он останавливается, когда сталкивается с символом, который мне кажется шестнадцатеричным. - person Glenn; 06.02.2014
comment
Да. gist.github.com/anonymous/5745ee1462f4dc584ba1 В текстовом файле, который я вижу на своем компьютере, есть символ, который мой текстовый редактор отображает как стрелку вправо. Это прямо перед цифрой 3 в конце четвертой строки. Хотя по сути это не проходит. Спасибо за вашу помощь. - person Glenn; 06.02.2014
comment
Я посмотрю на это позже вечером (я в UTC+1). - person DMKE; 06.02.2014
comment
Я нашел код, который работает: file = File.open(filename, 'rb') { |f| f.read }.split(\r\n). Однако это значительно медленнее. - person Glenn; 10.02.2014