Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Crea 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 è:

  1. Usare bufio.Scanner per leggere correttamente le righe di input e gestire gli spazi nei messaggi di log e negli schemi di formattazione
  2. Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere le singole voci di log
  3. Per ogni voce di log, dividerla in corrispondenza dei due punti per estrarre la stringa del timestamp e il messaggio
  4. Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere gli schemi di formattazione
  5. Visualizzare l'intestazione dell'applicazione: "=== LOG TIMESTAMP PARSER ==="
  6. Visualizzare lo stato dell'analisi: "Processing log entries with multiple timestamp formats..."
  7. 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.Parse finché 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"
  8. 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]"
  9. Visualizzare le statistiche di utilizzo degli schemi di formattazione:
    • "Layout pattern usage:"
    • Per ogni schema di formattazione: " [layout_pattern]: [number_of_times_used] times"
  10. 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]"
  11. 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
	
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online