Статьи

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

FDA (Управление по контролю за продуктами и лекарствами) является агентством Министерства здравоохранения и социальных служб США. Он отвечает за защиту и укрепление общественного здоровья посредством регулирования и надзора за безопасностью пищевых продуктов, табачными изделиями, пищевыми добавками, отпускаемыми по рецепту и без рецепта фармацевтическими препаратами (лекарствами), вакцинами, биофармацевтическими препаратами, переливаниями крови, медицинскими приборами, излучением электромагнитного излучения. приборы (ERED), косметика, корма и корма для животных [5] и ветеринарные препараты. выдыхает

FDA предоставляет сжатый файл данных базы данных Drugs @ FDA , в котором содержится информация о препаратах, одобренных FDA. Все поля в файлах данных разделены символами табуляции. Хотя официальное онлайн-приложение Drugs @ FDA обновляется ежедневно, файл данных по ссылке выше обновляется один раз в неделю, обычно по средам.

Проблема…

Вы можете спросить: «Почему ты мне это говоришь?» Хороший вопрос.

Чтобы прояснить проблему, первым делом я хочу скачать базу данных drugfda.zip (1,7 МБ) и разархивировать файл. Разархивировав файл, вы увидите 9 текстовых файлов (таблиц), как показано на рисунке ниже:

drugsatfda

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

Предположим, вы решили заменить слово « лекарство» лекарством в одном из файлов FDA. Это просто, и, конечно же, существуют расширенные формы поиска и замены. Фактически, я упоминаю пару таких методов в статье об охоте за последовательностью генов .

Если бы у нас был только один файл, это было бы просто. Однако в нашем случае у нас есть 9 текстовых файлов, которые мы хотим найти и изменить. Очевидно, слово « наркотик» встречается в нескольких текстовых файлах. На самом деле это происходит в следующих файлах:

  • AppDoc
  • заявление
  • ChemTypeLookup
  • Продукт

Как может помочь Ruby?

Поскольку эта серия связана с Ruby, давайте решим это с помощью «Ruby Way».

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

Для того, чтобы сделать эти шаги, мы будем использовать класс Dir . Пример использования класса:

Dir['C:/Users/Abder-Rahman/Desktop/drugsatfda/*.txt']
=> ["C:/Users/Abder-Rahman/Desktop/drugsatfda/AppDoc.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/AppDocType_Lookup.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/application.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/ChemTypeLookup.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/DocType_lookup.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/Product.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/Product_tecode.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/RegActionDate.txt", "C:/Users/Abder-Rahman/Desktop/drugsatfda/ReviewClass_Lookup.txt"]

Dir*.txt

Имея интересующие вас имена файлов, пришло время прочитать содержимое каждого файла в каталоге. В Ruby файл можно прочитать с помощью IO.read , который прочитает файл и вернет его содержимое:

 IO.read("C:/Users/Abder-Rahman/Desktop/drugsatfda/AppDoc.txt")
=>...[contents of the file]...

Прочитав файл, давайте сделаем нужные замены. Здесь мы заинтересованы в замене medicationdrugs Полезной функцией Ruby является gsub , которая заменяет все вхождения первого аргумента вторым аргументом. Первый аргумент обычно является регулярным выражением, но может быть простой строкой.

Например, для вышеуказанной замены мы можем написать следующее:

 file_content.gsub!(/drugs/,'medication')

где file_contentIO.read

Мы должны быть осторожны здесь, хотя. В предоставленных текстовых файлах drugs В некоторых местах он может быть написан с большой буквы. Чтобы заменить все вхождения drugsmedication

 file_content.gsub!(/drugs/i,'medication')

Собираем все вместе

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

 files = Dir['C:/Users/Abder-Rahman/Desktop/drugsatfda/*.txt']
files.each do |filename|
  file_content = IO.read(filename)
  file_content.gsub!(/drugs/i,'medication')
  output = File.open(filename,'w')
  output.write(file_content)
  output.close
end
exit

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

Заключительные мысли перед запуском программы

Приведенная выше программа не имела проблем, когда я запускал ее в операционной системе Windows 8.1 . У меня, однако, была проблема, в частности с файлом AppDoc.txtUbuntu 15.04 и MAC OS X Yosemite . Если вы используете одну из последних систем, вы можете получить следующую ошибку:

program.rb:4:in

Чтобы решить эту проблему, основываясь на этом потоке, вы можете просто вставить следующий код после второй строки (также удалите четвертую строку) в исходной программе выше:

 if ! file_content.valid_encoding?
  file_content = file_content.encode('UTF-16be', :invalid=>:replace, :replace=>'?').encode('UTF-8')
  file_content.gsub!(/drugs/i,'medication')
end
file_content.gsub!(/drugs/i,'medication')

Другая мысль заключается в том, что если вы загляните внутрь AppDoc.txtdrugs Итак, мы хотим сообщить нашей программе о замене drugsнапример, « Лекарство», «Лекарство», «ЛЕКАРСТВО», «ЛЕКАРСТВО» и т. Д. ), За исключением URL-адресов. Это может быть немного сложно, и регулярные выражения играют важную роль в решении такой проблемы. Основываясь на появлении drugsdrugsmedication

 file_content.gsub!(/(?<!http:\/\/www\.)(?<!http:\/\/www\.accessdata.fda.gov.)[Dd]rugs/i, 'medication')

Обновленная версия программы теперь выглядит следующим образом:

 files = Dir['C:/Users/Abder-Rahman/Desktop/drugsatfda/*.txt']
files.each do |filename|
  file_content = IO.read(filename)
  if ! file_content.valid_encoding?
    file_content = file_content.encode('UTF-16be', :invalid=>:replace, :replace=>'?').encode('UTF-8')
    file_content.gsub!(/(?<!http:\/\/www\.)(?<!http:\/\/www\.accessdata.fda.gov.)[Dd]rugs/i, 'medication')
  end
    file_content.gsub!(/(?<!http:\/\/www\.)(?<!http:\/\/www\.accessdata.fda.gov.)[Dd]rugs/i, 'medication')
  output = File.open(filename,'w')
  output.write(file_content)
  output.close
end
exit

Запуск программы

Я назвал скрипт Ruby substitute.rb . Я запустил скрипт в ОС Windows, используя командную строку с Ruby , следующим образом:

рис.3

application.txt

 HETERO DRUGS LTD

После запуска скрипта он выглядит так:

 HETERO medication LTD

Вывод

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

Счастливого Рубин!