Analizzare stringhe di tempo
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 61 di 68.
A volte riceverai informazioni su data e ora sotto forma di stringhe, che devono essere convertite in oggetti time.Time per poterle elaborare. Go fornisce la funzione time.Parse per gestire questa conversione.
La funzione time.Parse funziona al contrario della formattazione: prende una stringa di layout e una stringa temporale, quindi restituisce un oggetto 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)
}Proprio come per la formattazione, usi gli stessi componenti della data di riferimento nella tua stringa di layout. Il layout "2006-01-02" indica a Go di aspettarsi la stringa di input nel formato YYYY-MM-DD. Il layout deve corrispondere esattamente al formato della stringa di input.
Ricorda che time.Parse restituisce due valori: l'oggetto time.Time analizzato e un errore. Controlla sempre l'errore per assicurarti che l'analisi sia riuscita, poiché le stringhe di data non valide o i layout non corrispondenti causeranno il fallimento dell'analisi.
Sfida
FacileCrea un parser di file di log che converta stringhe di timestamp di vari formati in oggetti time.Time per l'analisi. Questa sfida metterà alla prova la tua capacità di usare time.Parse con diversi schemi di formattazione per gestire i molteplici formati di data e ora comunemente presenti nei log di sistema.
Nota importante: Poiché i messaggi di log e gli schemi di formattazione possono contenere spazi, dovrai usare bufio.Scanner per leggere intere righe di input. La funzione fmt.Scanln interrompe la lettura al primo spazio, il che comprometterebbe le voci di log e gli schemi di formattazione contenenti spazi. Usa bufio.NewScanner(os.Stdin) e chiama scanner.Scan() seguito da scanner.Text() per leggere righe complete.
Riceverai due input:
- Una stringa contenente voci di log nel formato
"timestamp1:message1,timestamp2:message2,timestamp3:message3"(ad es.,"2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window") - Una stringa contenente schemi di formattazione separati da virgole nel formato
"layout1,layout2,layout3"(ad es.,"2006-01-02,2006/01/02,Jan 2 2006")
Il tuo compito è:
- Usare
bufio.Scannerper leggere correttamente le righe di input e gestire gli spazi nei messaggi di log e negli schemi di formattazione - Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere le singole voci di log
- Per ogni voce di log, dividerla in corrispondenza dei due punti per estrarre la stringa del timestamp e il messaggio
- Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere gli schemi di formattazione
- Visualizzare l'intestazione dell'applicazione:
"=== LOG TIMESTAMP PARSER ===" - Visualizzare lo stato dell'analisi:
"Processing log entries with multiple timestamp formats..." - Per ogni voce di log, provare ad analizzare il timestamp con ciascuno schema di formattazione finché uno non va a buon fine:
- Provare ogni schema di formattazione con
time.Parsefinché l'analisi non riesce (senza errori) - In caso di successo, visualizzare:
"Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])" - Visualizzare anche:
" Message: [log_message]" - Se nessuno schema funziona per un timestamp, visualizzare:
"Failed to parse: [timestamp_string] - no matching layout found"
- Provare ogni schema di formattazione con
- Dopo aver elaborato tutte le voci, visualizzare le statistiche dell'analisi:
"=== PARSING RESULTS ===""Total log entries processed: [number_of_entries]""Successfully parsed timestamps: [number_of_successful_parses]""Failed parsing attempts: [number_of_failed_parses]"
- Visualizzare le statistiche di utilizzo degli schemi di formattazione:
"Layout pattern usage:"- Per ogni schema di formattazione:
" [layout_pattern]: [number_of_times_used] times"
- Se è stato analizzato correttamente almeno un timestamp, visualizzare l'analisi cronologica:
"=== CHRONOLOGICAL ANALYSIS ===""Earliest timestamp: [earliest_parsed_time]""Latest timestamp: [latest_parsed_time]""Time span covered: [time_difference_description]"
- Visualizzare il messaggio di completamento:
"Log parsing completed - timestamps converted to time objects"
Usa il package time per le operazioni di analisi, il package strings per dividere le stringhe di input, i package bufio e os per gestire correttamente l'input e il package fmt per l'output formattato. Ricorda che time.Parse restituisce sia un oggetto time.Time sia un errore: devi controllare l'errore per determinare se l'analisi è riuscita. Quando l'analisi non riesce con uno schema, prova lo schema successivo finché non ne trovi uno funzionante o non esaurisci tutte le opzioni. Questa sfida mostra come gestire più formati di timestamp negli scenari reali di elaborazione dei log.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
// Crea uno scanner per leggere le righe di input
scanner := bufio.NewScanner(os.Stdin)
// Leggi le voci del log
scanner.Scan()
logEntries := scanner.Text()
// Leggi i modelli di layout
scanner.Scan()
layoutPatterns := scanner.Text()
// Analizza gli input
entries := strings.Split(logEntries, ",")
layouts := strings.Split(layoutPatterns, ",")
// Inizializza i contatori per le statistiche
totalEntries := len(entries)
successfulParses := 0
failedParses := 0
layoutUsage := make(map[string]int)
var parsedTimes []time.Time
// TODO: Scrivi il tuo codice qui sotto
// 1. Mostra l'intestazione dell'applicazione
// 2. Mostra lo stato dell'elaborazione
// 3. Elabora ogni voce del log:
// - Dividi la voce in corrispondenza di ":" per ottenere il timestamp e il messaggio
// - Prova ogni modello di layout finché non ne trovi uno che funziona
// - Mostra i risultati dell'analisi
// - Aggiorna le statistiche
// 4. Mostra le statistiche di parsing
// 5. Mostra le statistiche di utilizzo dei layout
// 6. Se i timestamp sono stati analizzati, mostra l'analisi cronologica
// 7. Mostra il messaggio di completamento
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività7Gestione degli errori in dettaglio
Tipi di errore personalizzatiAvvolgere gli errori con `%w`Rimuovere il wrapping con `errors.Is`Rimuovere il wrapping con `errors.As`Capire `panic`Usare `recover`Riepilogo - Divisione sicura10Lavorare con il tempo
Ottenere l'ora correnteCreare un orario specificoFormattare l'oraAnalizzare stringhe di tempoDurata temporaleOperazioni aritmetiche con il tempoSospensioni e tickerRiepilogo - Timer semplice2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online