В моем уроке Обработка больших файлов мы увидели, как использовать Ruby для извлечения некоторой части текста из большого текстового файла. Файл из этого поста ОЧЕНЬ большой (3,3 ГБ!), И теперь пришло время немного улучшить подход, который мы использовали в предыдущем уроке.
Сегодня вместо того, чтобы извлекать часть большого текстового файла, мы хотим перемещаться по нему. Другими словами, мы хотим плавно пролистать этот большой текстовый файл, Ruby!
Чтобы не изобретать колесо в отношении терминологии и файла, с которым мы будем работать, см. Разделы «Терминология» и «Получение файла» в Обработка больших файлов . Раздел терминологии проведет вас через некоторые концепции, которые полезны для этого урока. В последнем разделе показано, где взять большой текстовый файл, поскольку с этой игрушкой мы будем играть в этом уроке.
Давайте начнем.
Читайте, читайте, пока не устанете …
У нас сейчас очень большой текстовый файл под нашими поясами. Вы, вероятно, привыкли к тому, что текстовые файлы самые маленькие. Это, однако, не тот случай, когда речь идет о геномах. Когда вы откроете текстовый файл, связанный с геномами, ожидайте, что вы будете много читать, а я много значу!
Как упоминалось выше, вместо того, чтобы извлекать некоторую часть этого большого текстового файла, мы хотим плавно перемещаться (прокручивать) по текстовому файлу. Идея состоит в том, что вместо получения порция за порцией, как было показано в предыдущем уроке, вы можете решить, что просто хотите продолжать прокручивать, пока не устанете от процесса.
Предыдущая статья продемонстрировала, как текстовые редакторы, которые я использовал для открытия текстового файла, просто сошли с ума. На данный момент нам нужен Ruby.
Давайте напишем скрипт, который пользователь может запустить в командной строке, чтобы указать файл и обработать нашу плавную прокрутку. Первое, что мы просим, - это дать нам имя файла, который будет храниться в переменной. Таким образом, откройте пустой файл и добавьте следующее:
puts "Enter the file name you want to scroll through" file_name = gets.chomp
gets
— это метод, который получает пользовательский ввод в виде строки. chomp
используется для удаления \n
, который вы получаете при нажатии клавиши ввода / возврата.
Большой! Мы прочитали имя файла. Теперь просто открыть этот файл. Это делается следующим образом:
input_file = File.open(file_name,'r')
Файл открывается в режиме read
, который указан в r
.
После открытия файла давайте пройдемся по этому файлу построчно. Поскольку мы хотим перемещаться (прокручивать) по текстовому файлу, было бы неплохо отобразить чанк вывода по чанку. Другими словами, отобразите определенный объем текста, а затем попросите пользователя нажать любую клавишу, чтобы продолжить прокрутку, или набрать EXIT
чтобы завершить программу.
Метод Ruby, который пригодится на этом этапе, — each_line
, который считывает каждую строку из текстового файла. Мы можем сделать следующее:
input_file.each_line do |line|
Для продолжения навигации (прокрутки) по текстовому файлу мы будем использовать цикл while true
, который представляет собой бесконечный цикл. Однако мы добавим условный оператор ( т. Е. Если), чтобы проверить ответ пользователя и выйти при необходимости.
Я упоминал выше, что мы будем выводить текст кусками. Скажем, куски по 100 строк. В этом случае, после отображения этих 100 строк, попросите пользователя нажать любую клавишу, чтобы продолжить чтение, или введите EXIT
чтобы выйти.
Таким образом, мы можем добавить следующее if-statement
для этого случая:
if response == 'EXIT' exit end
Что касается продолжения прокрутки, пользователь может нажать любую клавишу. Нам нужно сохранить какое-то состояние, чтобы мы знали, когда остановиться, и предложить пользователю продолжить. Каждый раз, когда мы останавливаемся и просим пользователя предпринять какие-либо действия, мы можем сбрасывать счетчик, чтобы отслеживать количество отображаемых строк. Когда счетчик достигает значения 100
, это означает, что было отображено 100 строк, и пришло время предложить пользователю принять меры. В то же время мы возвращаем счетчик в 0
чтобы отслеживать отображаемые линии.
Я покажу весь сценарий в следующем разделе.
В целом
Вот наш модный новый скрипт на Ruby:
puts "Enter the file name you want to scroll through" file_name = gets.chomp input_file = File.open(file_name,'r') counter = 0 # used to keep track of the number of lines displayed user_input = ' ' # stores input from user while true input_file.each_line do |line| print line counter = counter + 1 if counter == 100 counter = 0 puts 'To continue scrolling, press any key...' puts 'To terminate, type EXIT and press enter' user_input = gets.chomp if user_input == 'EXIT' exit end end end end
Запуск программы
Чтобы запустить приведенный выше сценарий, введите в командной строке следующую команду (при условии, что имя файла scroll.rb ):
ruby scroll.rb
Вам будет предложено ввести имя файла, которое в нашем случае hg38.txt
:
Когда вы запустите программу, будут отображены первые 100 строк, и вы получите подсказку с просьбой продолжить или прекратить работу. На рисунке ниже показана третья страница (прокрутка):
Если вы EXIT
вместо любой клавиши, программа прекратит работу, и вы сможете продолжить свой веселый путь.
EXIT
Как мы видели в этом уроке, Ruby позволяет легко и просто прокручивать очень большие текстовые файлы. Теперь мы не ограничены слабостями текстовых редакторов при работе с большими файлами.
Как вы думаете, эта идея может привести к созданию текстового редактора на основе Ruby? Как вы думаете, какие преимущества может дать такой редактор? Как вы думаете, это будет высокая производительность? Какие еще вопросы нужно решить редактору?
В следующей статье серии «Рубин на медицине» мы отправимся на охоту за неуловимой последовательностью генов. Будьте на связи!