Статьи

Рубин по медицине: прокрутка больших файлов

Рубин по медицине

В моем уроке Обработка больших файлов мы увидели, как использовать 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 

run_script

Вам будет предложено ввести имя файла, которое в нашем случае hg38.txt :

имя файла

Когда вы запустите программу, будут отображены первые 100 строк, и вы получите подсказку с просьбой продолжить или прекратить работу. На рисунке ниже показана третья страница (прокрутка):

свиток

Если вы EXIT вместо любой клавиши, программа прекратит работу, и вы сможете продолжить свой веселый путь.

EXIT

Как мы видели в этом уроке, Ruby позволяет легко и просто прокручивать очень большие текстовые файлы. Теперь мы не ограничены слабостями текстовых редакторов при работе с большими файлами.

Как вы думаете, эта идея может привести к созданию текстового редактора на основе Ruby? Как вы думаете, какие преимущества может дать такой редактор? Как вы думаете, это будет высокая производительность? Какие еще вопросы нужно решить редактору?

В следующей статье серии «Рубин на медицине» мы отправимся на охоту за неуловимой последовательностью генов. Будьте на связи!