Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task #41

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open

Task #41

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,20 @@ CodeKiller777
Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение.

## Автор решения
Шармадини Елена Шалвовна

## Описание реализации
Программа обрабатывает исходный файл для формирования топ-3 сотрудников. Реализована функция find_winners. Для проверки корректноссти исходных строк с информацией о коммитах используются регулярные выражения. Если строка неккоректна, то она игнорируется, а в консоль выводится сообщение о неккоректности конкретной строки. Для обработки данных все логины сотрудников записываются в словарь, где ключ - это логин, а значение - число коммитов. Сформированный топ записывается в файл "result.txt".


## Инструкция по сборке и запуску решения
1. Убедитесь в том, что у Вас установлен python
```
python --version
```
2. Скачать файл ``main.py``.
3. Поместить в ту же папку файл ``commits.txt``.
4. Запустить ``main.py``
```
python main.py
```
8 changes: 8 additions & 0 deletions commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
BIvanov 25ec001 2024-04-24T13:56:39.492
BIvanov 25ec001 2024-04-24T13:56:39.492
BIvanov 25ec001 2024-04-24T13:56:39.492
BIvanov 25ec001 2024-04-24T13:56:39.492
BIvanov 25ec001 2024-04-24T13:56:39.492
CIvanov 25ec001 2024-04-24T13:56:39.492
AIvanov 25ec001 2024-04-24T13:56:39.492
AIvanov 25ec001 2024-04-24T13:56:39.492
35 changes: 35 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import re


def find_winners(commits_file: str, result_file: str, winner_count: int) -> None:
users = {}

# Шаблон строки - сведений о коммите
sample = re.compile(r'^(([a-zA-Z][a-zA-z0-9_]*)\s[a-z0-9]{7}\s\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d{3})?)$')

# Считываем данные из файла commits_file
with open(commits_file, 'r') as f:
for line in f:
if sample.match(line):
username: str = line.split()[0]
if username in users.keys():
users[username] += 1
else:
users[username] = 1
else:
print(f"Ошибка в формате строки:{line}строка игнорируется")

# Находим топ-3 пользователей
top_users = sorted(users, key=users.get, reverse=True)[:winner_count]

# Записываем топ пользователей в файл
with open(result_file, 'w') as f:
for user in top_users:
f.write(user + '\n')

print(f'Топ пользователей записан в {result_file}')


if __name__ == '__main__':
find_winners('commits.txt', 'result.txt', 3)

3 changes: 3 additions & 0 deletions result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BIvanov
AIvanov
CIvanov