Представьте, что другая программа пишет лог-файлы, где каждая строка начинается с даты формата dd.MM.YYYY.
Ваша задача – написать функцию ExtractLog(inputFileName string, start, end time.Time) ([]string, error), которая вернет строки “лога”, созданные в указанный диапазон времени [start..end]
Формат вывода
Если в процессе работы возникает любая ошибка, то необходимо вернуть nil, err.
Если ошибок нет, то возвращайте nil в качестве значения ошибки.
Если ни одна строка не попала в указанный диапазон, то должна также вернуться произвольная ошибка.
go
package main
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, err
}
defer file.Close()
// Инициализация списка строк-логов
logStrings := []string{}
// Создание объекта-читателя для файла
scanner := bufio.NewScanner(file)
for scanner.Scan() {
// Получение текущей строки
line := scanner.Text()
// Разделение строки на дату и остальную часть
parts := strings.SplitN(line, " ", 2)
if len(parts) != 2 {
// Пропустить строку, если нет даты или остальной части
continue
}
// Преобразование строки с датой в объект типа time.Time
dateStr := parts[0]
date, err := time.Parse("02.01.2006", dateStr)
if err != nil {
// Пропустить строку, если не удалось преобразовать дату
continue
}
// Проверка, попадает ли дата в указанный диапазон
if date.After(start) && date.Before(end) {
// Добавление строки в список строк-логов
logStrings = append(logStrings, line)
}
}
if err := scanner.Err(); err != nil {
// Возвращаем ошибку, если при чтении файла произошла ошибка
return nil, err
}
// Проверка, найдены ли строки-логи в указанный диапазон
if len(logStrings) == 0 {
return nil, fmt.Errorf("No log entries found in the specified time range")
}
return logStrings, nil
}
func main() {
// Пример использования функции ExtractLog
start, _ := time.Parse("02.01.2006", "01.01.2022")
end, _ := time.Parse("02.01.2006", "31.01.2022")
logs, err := ExtractLog("log.txt", start, end)
if err != nil {
fmt.Println("Error:", err)
return
}
for _, log := range logs {
fmt.Println(log)
}
}
В данном примере функция ExtractLog принимает три аргумента: имя файла с логами (inputFileName), начальную дату (start) и конечную дату (end). Функция открывает файл, читает его построчно, разбивает каждую строку на дату и остальную часть, преобразует строку с датой в объект типа time.Time, проверяет, попадает ли дата в указанный диапазон, и добавляет строку в список logStrings, если она попадает в диапазон. В конце функция проверяет, были ли найдены строки-логи в указанный диапазон, и возвращает список строк-логов и ошибку (если была).
В функции main приведен пример использования функции ExtractLog. Создаются объекты типа time.Time для начальной и конечной даты, вызывается функция ExtractLog с указанием имени файла и диапазона дат, и выводятся полученные строки-логи. Если при вызове функции происходит ошибка, она выводится на экран.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет