FDA (Управление по контролю за продуктами и лекарствами) является агентством Министерства здравоохранения и социальных служб США. Он отвечает за защиту и укрепление общественного здоровья посредством регулирования и надзора за безопасностью пищевых продуктов, табачными изделиями, пищевыми добавками, отпускаемыми по рецепту и без рецепта фармацевтическими препаратами (лекарствами), вакцинами, биофармацевтическими препаратами, переливаниями крови, медицинскими приборами, излучением электромагнитного излучения. приборы (ERED), косметика, корма и корма для животных [5] и ветеринарные препараты. выдыхает
FDA предоставляет сжатый файл данных базы данных Drugs @ FDA , в котором содержится информация о препаратах, одобренных FDA. Все поля в файлах данных разделены символами табуляции. Хотя официальное онлайн-приложение Drugs @ FDA обновляется ежедневно, файл данных по ссылке выше обновляется один раз в неделю, обычно по средам.
Проблема…
Вы можете спросить: «Почему ты мне это говоришь?» Хороший вопрос.
Чтобы прояснить проблему, первым делом я хочу скачать базу данных drugfda.zip (1,7 МБ) и разархивировать файл. Разархивировав файл, вы увидите 9 текстовых файлов (таблиц), как показано на рисунке ниже:
Из заголовка этой статьи вы, вероятно, догадались, что мы собираемся выяснить, как вносить изменения в содержимое всех этих файлов одновременно. Вот почему ты мне нравишься, ты — сурмейсер.
Предположим, вы решили заменить слово « лекарство» лекарством в одном из файлов 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]...
Прочитав файл, давайте сделаем нужные замены. Здесь мы заинтересованы в замене medication
drugs
Полезной функцией Ruby является gsub
, которая заменяет все вхождения первого аргумента вторым аргументом. Первый аргумент обычно является регулярным выражением, но может быть простой строкой.
Например, для вышеуказанной замены мы можем написать следующее:
file_content.gsub!(/drugs/,'medication')
где file_content
IO.read
Мы должны быть осторожны здесь, хотя. В предоставленных текстовых файлах drugs
В некоторых местах он может быть написан с большой буквы. Чтобы заменить все вхождения drugs
medication
file_content.gsub!(/drugs/i,'medication')
Собираем все вместе
Теперь давайте посмотрим, как выглядит наш скрипт на Ruby. Сценарий будет проходить через все текстовые файлы в каталоге drugsatfda
drugs
drugs
medication
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.txt
Ubuntu 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.txt
drugs
Итак, мы хотим сообщить нашей программе о замене drugs
например, « Лекарство», «Лекарство», «ЛЕКАРСТВО», «ЛЕКАРСТВО» и т. Д. ), За исключением URL-адресов. Это может быть немного сложно, и регулярные выражения играют важную роль в решении такой проблемы. Основываясь на появлении drugs
drugs
medication
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 , следующим образом:
application.txt
HETERO DRUGS LTD
После запуска скрипта он выглядит так:
HETERO medication LTD
Вывод
Иногда необходимо заменить определенную строку другой в нескольких файлах. Это может быть дополнительно осложнено файлами очень большого размера. Выполнение такой задачи вручную утомительно и отнимает много времени. Ruby, опять же, доказывает свою способность радовать разработчиков быстрым, интуитивно понятным языком, который легко справляется с нашей задачей.
Счастливого Рубин!