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

Мыслительный процесс

Оглядываясь назад на документ, который нам предстоит обработать, в чем здесь (человеческая) логика? Я опубликую скриншот документа NIST CSF.

Так что для меня логика очень проста.

  1. Мы будем повторять каждую подкатегорию, потому что это наша главная задача.
  2. Для каждой подкатегории мы рассмотрим информативные ссылки и найдем ячейку, содержащую «NIST SP 800–53 Rev. 4».
  3. Для нескольких первых данных это кажется последовательным, поэтому мы можем пропустить «NIST SP 800–53 Rev. 4» и просто взять данные после этого.
  4. Мы будем выделять выбранную строку пробелом (‘ ’).
  5. Мы зациклим каждый отдельный элемент, удалим конечные и начальные пробелы (' '), чтобы было чище.
  6. Мы откроем справочный документ, который является «NIST SP 800–53 Rev. 5» (используйте rev 5 вместо 4, потому что я не нахожу rev 4 в файле Excel)
  7. Мы рассмотрим детали элемента управления, выполнив поиск элементов на шаге 5 в столбце «Идентификатор элемента управления» в документе «NIST SP 800–53 Rev. 5».
  8. Поскольку это официальный документ, я полагаю, что все данные, которые нам нужны, доступны, поэтому ошибки «нет ссылки» не будет.
  9. Объедините их все вместе и экспортируйте в файл Excel.

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

  1. Строки в столбце «подкатегория» объединяются для каждой подкатегории. Их лучше нормализовать, поэтому я разъединил ячейку и заполнил значениями неслитую ячейку.
  2. Возможно, есть некоторые дополнительные очки для определенных элементов управления, например, CM-8 имеет еще 9 дополнительных очков. Из-за этого нам нужен дополнительный код, чтобы проверить, есть ли у элемента управления дополнительные точки.

На этом план на данный момент заканчивается. Мы будем строить код. Прежде нам нужно привести в порядок наш Excel. Под уборкой я подразумеваю отсутствие объединенной ячейки и заполнение всей пустой ячейки из-за процесса разделения. Вы можете узнать это на здесь.

К тому времени мы готовы!

Фрагмент 1 выше делает:

  1. Строка 2. Импортируем необходимую библиотеку, в данном случае используем библиотеку «pandas».
  2. Строка 4–6. Мы загружаем Excel во фрейм данных и получаем только те данные, которые начинаются с «NIST» в столбце «Информационные ссылки».
  3. Строка 8. Мы инициируем пустой массив, который будет своего рода заполнителем для наших данных.
  4. Строка 9–26. Делаем петлю. Для каждой подкатегории данных мы сопоставляем с элементами управления NIST SP 800–53 rev 5.
  5. Строка 12–14. Получаем значение функции, категории, подкатегории. Мы будем использовать их при создании Excel.
  6. Строка 16. Получаем значение ячейки из столбца «Информативные ссылки». Значение должно быть примерно таким: «NIST SP 800–53 Rev. 4 CP-2, IR-4, IR-8».
  7. Строка 17. Получаем список нужных нам элементов управления, пропуская первые 22 символа (чтобы убрать часть «NIST SP 800–53 Rev. 4») и берём из неё остальное (вот смысл по [22:]
  8. Строка 18. Мы разделяем строку запятой «, чтобы мы могли пройтись по каждому элементу управления.
  9. Строка 20–26. Делаем еще одну петлю. Для каждого элемента управления мы сопоставляем каждую деталь элемента управления.
  10. Строка 22. Мы вызываем функцию «get_nist800r5_ctrl_detail», которую быстро рассмотрим. Дело в том, что эта функция дает нам сопоставление подкатегории с элементами управления NIST SP 800–53 rev 5.
  11. Строка 23–25. Мы добавляем 3 столбца (функция, категория, подкатегория) и присваиваем им значение, которое мы получили ранее (строка 12–14).
  12. Строка 26. Мы добавляем в заполнитель, который мы подготовили ранее (строка 8).
  13. Строка 28. Конвертируем контейнер во фрейм данных (чтобы его можно было экспортировать в excel)
  14. Строка 29. Мы меняем имя столбца, чтобы оно было более информативным.
  15. Строка 30. Изменяем порядок столбцов.
  16. Строка 32. Экспортируем окончательный фрейм данных в excel.

Примечание. Если вам интересно, откуда у меня весь синтаксис? Я гуглил каждую строчку. Я конечно не всё копировал, я написал, а вот сам синтаксис я в гугле таки посмотрел.

Вторая часть, которую мы рассмотрим, — это функция «get_nist800r5_ctrl_detail».

Это выглядит как длинный, но голый со мной, это не так сложно. Если внимательно присмотреться, там много повторяющихся кодов. Итак, в принципе, идея проста.

  1. Строка 4. Мы можем игнорировать это (буквально). Это значение будет использоваться для добавления некоторой информации о том, что все данные, сгенерированные этой функцией, взяты из документа «NIST 800–53 rev 5».
  2. Строка 5. Мы загружаем значение документа «NIST SP 800–53 rev 5» и помещаем его во фрейм данных.
  3. Строка 7. Подготавливаем заполнитель для наших данных.
  4. Строка 9. Мы берем данные, которые содержат точное значение nist800r5_ctrlID, которое мы передаем. Например, если мы передаем такое значение, как «CM-8», этот код займет единственную строку, в которой значение «Идентификатора управления» равно «CM-8».
  5. Строка 10–14. Мы устанавливаем значение по умолчанию для нескольких переменных («control_identifier» = значение «nist800r5_ctrlID», «control_name», «control», «discussion» и «related_controls» на «-».
  6. Строка 16. Проверяем, существует ли строка, если нет, то продолжаем, если есть, то продолжаем до следующего номера.
  7. Строка 18–21. Если строка существует, мы берем значение control_name, control, обсуждение и related_controls из полученной строки.
  8. Строка 23–24. Независимо от того, существует строка или нет, мы преобразуем переменную control_identifier, control_name, control, обсуждение и related_controls во фрейм данных. После этого мы добавим значение в наш заполнитель.
  9. Строка 26–41. Мы делаем то же самое, что и раньше, но на этот раз мы получим дополнительные элементы управления. Дополнительные элементы управления имеют шаблон типа «control_identifier («+ число +»)». Например, СМ-8(1), СМ-8(2), АС-3(8). Вот почему я стараюсь искать строки, начинающиеся с «control_identifier()», например «CM-8(».
  10. Строка 42. Мы «возвращаем» значение тому, кто вызывает эту функцию, в нашем случае — нашу основную функцию выше.

И это окончательный excel, сгенерированный программой. Все было сделано за «секунды :)»

Дополнительные замечания

Итак, я обнаружил небольшую неэффективность в нашем коде (мне очень жаль) и попытался это исправить. Я исправил это, переместив процесс загрузки файла «NIST SP 800–53 rev 5» наверх (не внутри функции «get_nist800r5_ctrl_detail», а скорее в основной функции), потому что это так неэффективно, если нам приходится перезагружать файл каждый раз. время, когда мы вызываем функцию. Это делает программу намного медленнее.

Закрытие

Я знаю, что это трудная тема, и, возможно, большинство из вас не прочитает это сообщение. Но на всякий случай, поздравляю, и я надеюсь, что мой пост даст вам немного знаний о том, как работает программирование и как это весело. Я надеюсь, что вам будет предложено изучать компьютерное программирование самостоятельно. БОГУ вся слава, Soli Deo Gloria!