
Вот подробная структура проекта и готовое **Техническое Зада...
Prompt
Вот подробная структура проекта и готовое **Техническое Задание (ТЗ) в формате промпта**, которое ты можешь скопировать и отправить другому ИИ (или использовать как основу для разработки). Оно написано так, чтобы ИИ понял **бизнес-логику**, но при этом имел свободу выбора лучших инструментов и архитектурных решений. --- ### 1. Рекомендуемая структура файлов (если ИИ будет писать на Python/Streamlit) Если ИИ выберет Python (что рекомендуется для работы с Excel), структура должна быть модульной, чтобы код не превратился в «кашу»: ```text student_records_migrator/ │ ├── app.py # Точка входа, UI (Streamlit/Flask), обработка загрузки файлов ├── requirements.txt # Зависимости (openpyxl, pandas, streamlit и т.д.) │ ├── core/ # Папка с бизнес-логикой │ ├── __init__.py │ ├── parser.py # Парсинг старого шаблона (извлечение данных и предметов) │ ├── transformer.py # Математика и логика (группировка по курсам, дублирование строк) │ └── exporter.py # Запись данных в структуру нового шаблона │ ├── utils/ # Вспомогательные функции │ ├── __init__.py │ └── helpers.py # Очистка данных, валидация дат, поиск паттернов │ └── templates/ # (Опционально) Если используется HTML/JS frontend └── index.html ``` --- ### 2. Техническое задание (Промпт для ИИ-разработчика) *Скопируй текст ниже и отправь его ИИ.* *** **Роль:** Ты — Senior Python/Fullstack Developer и Data Engineer, специализирующийся на автоматизации обработки табличных данных (Excel/XLSX) и создании удобных веб-интерфейсов. **Задача:** Разработать веб-приложение для миграции данных студентов из «Старого шаблона» зачётной книги в «Новый шаблон». **Главное правило трансформации:** «1 курс = 1 строка». Если студент учится на 4 курсе, в итоговом файле должно быть 4 строки с его базовыми данными, но в каждой строке должны быть заполнены только предметы, относящиеся к соответствующему курсу (1-й, 2-й, 3-й и 4-й соответственно). ### 📥 Входные данные 1. **Старый шаблон (один или несколько файлов `.xlsx`)**: Содержит базу студента (UID, ФИО, Курс, Номер книжки, Дата выдачи) и горизонтальный «шлейф» из предметов. Предметы идут блоками по 6 колонок: `[Название | Учебный год (ГГГГ/ГГГГ) | Часы | Оценка | Дата | Преподаватель]`. Блоки могут повторяться много раз, между ними могут быть пустые ячейки. 2. **Новый шаблон (один файл `.xlsx`)**: Эталонный файл, в структуру которого (в его заголовки и колонки) нужно выгрузить итоговые данные. Структура нового файла отличается от старого (другой порядок колонок, есть отдельные блоки для НИР, практики, курсовых и т.д.). ### ⚙️ Бизнес-логика и Алгоритм (Core Logic) **Шаг 1. Парсинг старого файла** * Прочитать файл. Найти строку с заголовками. * Для каждой строки со студентом извлечь базовую информацию. * Извлечь все предметы. *Подсказка для ИИ:* Не привязывайся к жестким номерам колонок, так как они «плавают». Ищи паттерн учебного года (регулярное выражение `\d{4}/\d{4}`), чтобы точно определить начало блока предмета и вытащить связанные с ним данные. **Шаг 2. Трансформация и группировка (Самое важное)** * Для каждого студента найти самый ранний `Учебный год` в его списке предметов. Этот год = **1 курс**. * Присвоить каждому предмету номер курса: `Курс = (Год начала предмета) - (Самый ранний год) + 1`. * Определить текущий курс студента (из базовой информации или как максимальный найденный курс). * **Создать N строк для студента**, где N = его текущий курс. * В строку для 1-го курса поместить только предметы 1-го курса. В строку для 2-го курса — только предметы 2-го курса и т.д. Базовые данные студента (ФИО, UID и т.д.) дублируются во все N строк. * *Добавить в конец строки (или в специальную колонку нового шаблона) маркер: «Номер курса, к которому относится эта строка»*, чтобы пользователь не запутался. **Шаг 3. Маппинг в Новый шаблон** * Загрузить предоставленный пользователем «Новый шаблон» как эталон. * Динамически расширить колонки в новом шаблоне, если предметов у студента больше, чем заложено в заголовке (использовать `openpyxl` или `pandas` для вставки колонок/строк без потери форматирования, если это возможно, либо сгенерировать новый чистый файл на основе заголовков нового шаблона). * Заполнить базовые колонки (ФИО, UID и т.д.). * Заполнить колонки предметов. * Остальные специфические колонки нового шаблона (ВКР, Практика, НИР), которых нет в старом файле, оставить пустыми. ### 🛠 Технические требования и свободы * **Стек:** Я оставляю за тобой выбор стека. Если ты считаешь, что `Python + Streamlit + openpyxl/pandas` будет лучшим решением — используй его. Если ты можешь сделать это на чистом `Frontend (HTML/JS + SheetJS)` без бэкенда, чтобы файл вообще не загружался на сервер — делай так. Главное — надежность и скорость. * **Обработка ошибок:** Файлы могут быть «грязными». Предусмотри обработку случаев, когда у предмета нет года, когда ФИО написано не полностью, или когда строки пустые. Не давай скрипту упасть с `IndexError`. * **UI/UX:** Интерфейс должен иметь две зоны загрузки (Drag & Drop): одна для старых файлов (мультивыбор), вторая для нового шаблона. Кнопка «Обработать и скачать». Индикатор прогресса или статуса. * **Производительность:** Код должен уметь обрабатывать файлы на 1000+ строк без зависания браузера/сервера. ### 📤 Ожидаемый результат от тебя 1. Полный, готовый к запуску код (весь в одном файле или разбитый по структуре, как ты считаешь правильным). 2. Инструкция по установке зависимостей и запуску (например, `pip install ...` и `streamlit run ...`). 3. Краткое объяснение того, как твой код решает проблему «плавающих» колонок в старом шаблоне. *** ### 💡 Почему это ТЗ сработает лучше всего: 1. **Оно задает «Паттерн года» (`\d{4}/\d{4}`)** как якорь. ИИ часто тупит на парсинге Excel, пытаясь угадать номер колонки. Указав якорь, мы заставляем ИИ написать надежный алгоритм поиска. 2. **Оно дает свободу в стеке.** ИИ сам решит, что лучше: `pandas` для скорости или `openpyxl` для сохранения стилей Excel. 3. **Оно явно описывает математику курсов.** Формула `Курс = Год - МинГод + 1` избавит ИИ от галлюцинаций и жестких привязок к датам поступления. 4. **Оно требует маркера курса.** Это спасет тебя от хаоса, когда ты откроешь итоговый Excel и не поймешь, какая строка к какому году относится.