Menu
Coddy logo textTech

Parsowanie ciągów czasu

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 61 z 68.

Czasami otrzymasz informacje o dacie i godzinie w postaci ciągów znaków, które trzeba przekonwertować na obiekty time.Time w celu ich przetworzenia. Go udostępnia funkcję time.Parse, która umożliwia tę konwersję.

Funkcja time.Parse działa odwrotnie niż formatowanie — przyjmuje ciąg formatu oraz ciąg z czasem, a następnie zwraca obiekt time.Time:

dateString := "2023-10-26"
parsedTime, err := time.Parse("2006-01-02", dateString)
if err != nil {
    fmt.Println("Error parsing time:", err)
} else {
    fmt.Println(parsedTime)
}

Podobnie jak w przypadku formatowania, w ciągu układu używasz tych samych składników daty referencyjnej. Układ "2006-01-02" informuje Go, że ma oczekiwać ciągu wejściowego w formacie YYYY-MM-DD. Układ musi dokładnie odpowiadać formatowi ciągu wejściowego.

Pamiętaj, że time.Parse zwraca dwie wartości: sparsowany obiekt time.Time oraz błąd. Zawsze sprawdzaj błąd, aby upewnić się, że parsowanie zakończyło się powodzeniem, ponieważ nieprawidłowe ciągi dat lub niezgodne układy spowodują niepowodzenie parsowania.

challenge icon

Wyzwanie

Łatwy

Utwórz parser plików dziennika, który konwertuje ciągi znaczników czasu w różnych formatach na obiekty time.Time do analizy. To wyzwanie sprawdzi Twoją umiejętność używania time.Parse z różnymi wzorcami układu, aby obsługiwać wiele formatów daty i czasu powszechnie spotykanych w dziennikach systemowych.

Ważna uwaga: Ponieważ komunikaty dziennika i wzorce układu mogą zawierać spacje, musisz użyć bufio.Scanner, aby odczytać całe wiersze wejściowe. Funkcja fmt.Scanln przestaje czytać po napotkaniu pierwszej spacji, co spowodowałoby problemy z wpisami dziennika i układami zawierającymi spacje. Użyj bufio.NewScanner(os.Stdin) i wywołaj scanner.Scan(), a następnie scanner.Text(), aby odczytać całe wiersze.

Otrzymasz dwa dane wejściowe:

  • Ciąg zawierający wpisy dziennika w formacie "timestamp1:message1,timestamp2:message2,timestamp3:message3" (np. "2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")
  • Ciąg zawierający wzorce układu rozdzielone przecinkami w formacie "layout1,layout2,layout3" (np. "2006-01-02,2006/01/02,Jan 2 2006")

Twoje zadanie:

  1. Użyj bufio.Scanner, aby prawidłowo odczytać wiersze wejściowe i obsłużyć spacje w komunikatach dziennika oraz wzorcach układu
  2. Podziel pierwsze dane wejściowe po przecinkach, aby uzyskać poszczególne wpisy dziennika
  3. W przypadku każdego wpisu dziennika podziel go po dwukropkach, aby wyodrębnić ciąg znacznika czasu i komunikat
  4. Podziel drugie dane wejściowe po przecinkach, aby uzyskać wzorce układu
  5. Wyświetl nagłówek aplikacji: "=== LOG TIMESTAMP PARSER ==="
  6. Wyświetl stan analizowania: "Processing log entries with multiple timestamp formats..."
  7. W przypadku każdego wpisu dziennika spróbuj przeanalizować znacznik czasu, używając kolejnych wzorców układu, aż jeden z nich zadziała:
    • Sprawdzaj każdy wzorzec układu za pomocą time.Parse, aż analizowanie zakończy się powodzeniem (bez błędu)
    • Po pomyślnym przetworzeniu wyświetl: "Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])"
    • Wyświetl również: " Message: [log_message]"
    • Jeśli żaden układ nie zadziała dla danego znacznika czasu, wyświetl: "Failed to parse: [timestamp_string] - no matching layout found"
  8. Po przetworzeniu wszystkich wpisów wyświetl statystyki analizowania:
    • "=== PARSING RESULTS ==="
    • "Total log entries processed: [number_of_entries]"
    • "Successfully parsed timestamps: [number_of_successful_parses]"
    • "Failed parsing attempts: [number_of_failed_parses]"
  9. Wyświetl statystyki użycia układów:
    • "Layout pattern usage:"
    • Dla każdego wzorca układu: " [layout_pattern]: [number_of_times_used] times"
  10. Jeśli udało się przeanalizować jakiekolwiek znaczniki czasu, wyświetl analizę chronologiczną:
    • "=== CHRONOLOGICAL ANALYSIS ==="
    • "Earliest timestamp: [earliest_parsed_time]"
    • "Latest timestamp: [latest_parsed_time]"
    • "Time span covered: [time_difference_description]"
  11. Wyświetl komunikat o zakończeniu: "Log parsing completed - timestamps converted to time objects"

Do operacji analizowania użyj pakietu time, do dzielenia ciągów wejściowych pakietu strings, do prawidłowej obsługi danych wejściowych pakietów bufio i os, a do formatowania wyników pakietu fmt. Pamiętaj, że time.Parse zwraca zarówno obiekt time.Time, jak i błąd — musisz sprawdzić błąd, aby ustalić, czy analizowanie się powiodło. Gdy analizowanie przy użyciu jednego układu się nie powiedzie, wypróbuj kolejny wzorzec układu, aż znajdziesz działający albo wyczerpiesz wszystkie możliwości. To wyzwanie pokazuje, jak obsługiwać wiele formatów znaczników czasu w rzeczywistych scenariuszach przetwarzania dzienników.

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"time"
)

func main() {
	// Utwórz skaner do odczytywania wierszy wejścia
	scanner := bufio.NewScanner(os.Stdin)
	
	// Odczytaj wpisy dziennika
	scanner.Scan()
	logEntries := scanner.Text()
	
	// Odczytaj wzorce formatów
	scanner.Scan()
	layoutPatterns := scanner.Text()
	
	// Przetwórz dane wejściowe
	entries := strings.Split(logEntries, ",")
	layouts := strings.Split(layoutPatterns, ",")
	
	// Zainicjalizuj liczniki statystyk
	totalEntries := len(entries)
	successfulParses := 0
	failedParses := 0
	layoutUsage := make(map[string]int)
	var parsedTimes []time.Time
	
	// TODO: Napisz swój kod poniżej
	// 1. Wyświetl nagłówek aplikacji
	// 2. Wyświetl stan przetwarzania
	// 3. Przetwórz każdy wpis dziennika:
	//    - Podziel wpis według ":" na znacznik czasu i wiadomość
	//    - Wypróbuj kolejne wzorce formatów, aż któryś zadziała
	//    - Wyświetl wyniki parsowania
	//    - Zaktualizuj statystyki
	// 4. Wyświetl statystyki parsowania
	// 5. Wyświetl statystyki użycia formatów
	// 6. Jeśli przeanalizowano znaczniki czasu, wyświetl analizę chronologiczną
	// 7. Wyświetl komunikat o zakończeniu
	
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online