Хорошо, после того, как я рассказал вам о причине, по которой вы должны начать изучать компьютерное программирование, в этом блоге я расскажу вам код, который я использовал для выполнения своей задачи в моем офисе. Если вы не читали причину, по которой вам стоит начать изучать программирование, вы можете перейти в пост здесь. Хорошо, приступим к технической части.
Мыслительный процесс
Оглядываясь назад на документ, который нам предстоит обработать, в чем здесь (человеческая) логика? Я опубликую скриншот документа NIST CSF.
Так что для меня логика очень проста.
- Мы будем повторять каждую подкатегорию, потому что это наша главная задача.
- Для каждой подкатегории мы рассмотрим информативные ссылки и найдем ячейку, содержащую «NIST SP 800–53 Rev. 4».
- Для нескольких первых данных это кажется последовательным, поэтому мы можем пропустить «NIST SP 800–53 Rev. 4» и просто взять данные после этого.
- Мы будем выделять выбранную строку пробелом (‘ ’).
- Мы зациклим каждый отдельный элемент, удалим конечные и начальные пробелы (' '), чтобы было чище.
- Мы откроем справочный документ, который является «NIST SP 800–53 Rev. 5» (используйте rev 5 вместо 4, потому что я не нахожу rev 4 в файле Excel)
- Мы рассмотрим детали элемента управления, выполнив поиск элементов на шаге 5 в столбце «Идентификатор элемента управления» в документе «NIST SP 800–53 Rev. 5».
- Поскольку это официальный документ, я полагаю, что все данные, которые нам нужны, доступны, поэтому ошибки «нет ссылки» не будет.
- Объедините их все вместе и экспортируйте в файл Excel.
Эти шаги выше были сразу же выскочили с первой мысли. После более глубокого анализа я нашел дополнительную информацию, которую необходимо учитывать.
- Строки в столбце «подкатегория» объединяются для каждой подкатегории. Их лучше нормализовать, поэтому я разъединил ячейку и заполнил значениями неслитую ячейку.
- Возможно, есть некоторые дополнительные очки для определенных элементов управления, например, CM-8 имеет еще 9 дополнительных очков. Из-за этого нам нужен дополнительный код, чтобы проверить, есть ли у элемента управления дополнительные точки.
На этом план на данный момент заканчивается. Мы будем строить код. Прежде нам нужно привести в порядок наш Excel. Под уборкой я подразумеваю отсутствие объединенной ячейки и заполнение всей пустой ячейки из-за процесса разделения. Вы можете узнать это на здесь.
К тому времени мы готовы!
Фрагмент 1 выше делает:
- Строка 2. Импортируем необходимую библиотеку, в данном случае используем библиотеку «pandas».
- Строка 4–6. Мы загружаем Excel во фрейм данных и получаем только те данные, которые начинаются с «NIST» в столбце «Информационные ссылки».
- Строка 8. Мы инициируем пустой массив, который будет своего рода заполнителем для наших данных.
- Строка 9–26. Делаем петлю. Для каждой подкатегории данных мы сопоставляем с элементами управления NIST SP 800–53 rev 5.
- Строка 12–14. Получаем значение функции, категории, подкатегории. Мы будем использовать их при создании Excel.
- Строка 16. Получаем значение ячейки из столбца «Информативные ссылки». Значение должно быть примерно таким: «NIST SP 800–53 Rev. 4 CP-2, IR-4, IR-8».
- Строка 17. Получаем список нужных нам элементов управления, пропуская первые 22 символа (чтобы убрать часть «NIST SP 800–53 Rev. 4») и берём из неё остальное (вот смысл по [22:]
- Строка 18. Мы разделяем строку запятой «, чтобы мы могли пройтись по каждому элементу управления.
- Строка 20–26. Делаем еще одну петлю. Для каждого элемента управления мы сопоставляем каждую деталь элемента управления.
- Строка 22. Мы вызываем функцию «get_nist800r5_ctrl_detail», которую быстро рассмотрим. Дело в том, что эта функция дает нам сопоставление подкатегории с элементами управления NIST SP 800–53 rev 5.
- Строка 23–25. Мы добавляем 3 столбца (функция, категория, подкатегория) и присваиваем им значение, которое мы получили ранее (строка 12–14).
- Строка 26. Мы добавляем в заполнитель, который мы подготовили ранее (строка 8).
- Строка 28. Конвертируем контейнер во фрейм данных (чтобы его можно было экспортировать в excel)
- Строка 29. Мы меняем имя столбца, чтобы оно было более информативным.
- Строка 30. Изменяем порядок столбцов.
- Строка 32. Экспортируем окончательный фрейм данных в excel.
Примечание. Если вам интересно, откуда у меня весь синтаксис? Я гуглил каждую строчку. Я конечно не всё копировал, я написал, а вот сам синтаксис я в гугле таки посмотрел.
Вторая часть, которую мы рассмотрим, — это функция «get_nist800r5_ctrl_detail».
Это выглядит как длинный, но голый со мной, это не так сложно. Если внимательно присмотреться, там много повторяющихся кодов. Итак, в принципе, идея проста.
- Строка 4. Мы можем игнорировать это (буквально). Это значение будет использоваться для добавления некоторой информации о том, что все данные, сгенерированные этой функцией, взяты из документа «NIST 800–53 rev 5».
- Строка 5. Мы загружаем значение документа «NIST SP 800–53 rev 5» и помещаем его во фрейм данных.
- Строка 7. Подготавливаем заполнитель для наших данных.
- Строка 9. Мы берем данные, которые содержат точное значение nist800r5_ctrlID, которое мы передаем. Например, если мы передаем такое значение, как «CM-8», этот код займет единственную строку, в которой значение «Идентификатора управления» равно «CM-8».
- Строка 10–14. Мы устанавливаем значение по умолчанию для нескольких переменных («control_identifier» = значение «nist800r5_ctrlID», «control_name», «control», «discussion» и «related_controls» на «-».
- Строка 16. Проверяем, существует ли строка, если нет, то продолжаем, если есть, то продолжаем до следующего номера.
- Строка 18–21. Если строка существует, мы берем значение control_name, control, обсуждение и related_controls из полученной строки.
- Строка 23–24. Независимо от того, существует строка или нет, мы преобразуем переменную control_identifier, control_name, control, обсуждение и related_controls во фрейм данных. После этого мы добавим значение в наш заполнитель.
- Строка 26–41. Мы делаем то же самое, что и раньше, но на этот раз мы получим дополнительные элементы управления. Дополнительные элементы управления имеют шаблон типа «control_identifier («+ число +»)». Например, СМ-8(1), СМ-8(2), АС-3(8). Вот почему я стараюсь искать строки, начинающиеся с «control_identifier()», например «CM-8(».
- Строка 42. Мы «возвращаем» значение тому, кто вызывает эту функцию, в нашем случае — нашу основную функцию выше.
И это окончательный excel, сгенерированный программой. Все было сделано за «секунды :)»
Дополнительные замечания
Итак, я обнаружил небольшую неэффективность в нашем коде (мне очень жаль) и попытался это исправить. Я исправил это, переместив процесс загрузки файла «NIST SP 800–53 rev 5» наверх (не внутри функции «get_nist800r5_ctrl_detail», а скорее в основной функции), потому что это так неэффективно, если нам приходится перезагружать файл каждый раз. время, когда мы вызываем функцию. Это делает программу намного медленнее.
Закрытие
Я знаю, что это трудная тема, и, возможно, большинство из вас не прочитает это сообщение. Но на всякий случай, поздравляю, и я надеюсь, что мой пост даст вам немного знаний о том, как работает программирование и как это весело. Я надеюсь, что вам будет предложено изучать компьютерное программирование самостоятельно. БОГУ вся слава, Soli Deo Gloria!