Представьте, что другая программа пишет лог-файлы, где каждая строка начинается с даты формата dd.MM.YYYY.
Ваша задача – написать функцию ExtractLog(inputFileName string, start, end time.Time) ([]string, error), которая вернет строки “лога”, созданные в указанный диапазон времени [start..end]
Формат вывода
Если в процессе работы возникает любая ошибка, то необходимо вернуть nil, err.
Если ошибок нет, то возвращайте nil в качестве значения ошибки.
Если ни одна строка не попала в указанный диапазон, то должна также вернуться произвольная ошибка.
go
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func ExtractLog(inputFileName string, start, end time.Time) ([]string, error) {
// Открываем файл с логами для чтения
file, err := os.Open(inputFileName)
if err != nil {
return nil, fmt.Errorf("failed to open log file: %w", err)
}
defer file.Close()
// Создаем срез строк для хранения логов
logData := []string{}
// Создаем сканер для построчного чтения файла
scanner := bufio.NewScanner(file)
for scanner.Scan() {
// Разбиваем строку на дату и остаток
parts := strings.SplitN(scanner.Text(), " ", 2)
if len(parts) != 2 {
return nil, fmt.Errorf("malformed log entry: %s", scanner.Text())
}
// Преобразуем строку с датой в формат time.Time
logTime, err := time.Parse("02.01.2006", parts[0])
if err != nil {
return nil, fmt.Errorf("failed to parse log entry date: %w", err)
}
// Проверяем, попадает ли дата в указанный диапазон
if logTime.After(start) && logTime.Before(end) {
logData = append(logData, scanner.Text())
}
}
// Проверяем, попал ли хотя бы один лог в указанный диапазон
if len(logData) == 0 {
return nil, fmt.Errorf("no log data in the specified range")
}
// Проверяем наличие ошибок при чтении файла
if err := scanner.Err(); err != nil {
return nil, fmt.Errorf("failed to read log file: %w", err)
}
return logData, nil
}
Пример использования функции ExtractLog:
go
func main() {
startTime, _ := time.Parse("02.01.2006", "01.01.2022")
endTime, _ := time.Parse("02.01.2006", "31.01.2022")
logData, err := ExtractLog("logs.txt", startTime, endTime)
if err != nil {
fmt.Println("Error:", err)
return
}
for _, logEntry := range logData {
fmt.Println(logEntry)
}
}
В данном примере функция ExtractLog используется для получения логов, созданных в январе 2022 года, из файла logs.txt. Если ошибок при выполнении функции нет, то выводятся все полученные логи. Если в указанный диапазон времени не попало ни одного лога, выводится ошибка "No log data in the specified range". Если при выполнении функции возникла любая другая ошибка, выводится соответствующее сообщение об ошибке.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет